dll中全局变量的初始化问题?

时间:2021-01-04 19:41:54
1)对于静态链接的dll,它的全局变量和静态变量什么时候初始化,是在dllmain函数之前么,和exe的全局变量谁先初始化?如果是动态链接的话,又是什么顺序?
2)对于动态链接的dll,使用loadlibrary()函数,它会创建自己的堆么?freelibrary()函数的调用会引起vc进行内存泄露检查么,那它检测的是那部分的内存泄露,是这个dll函数中的么?
3)在windows核心编程里头有以下代码:
VOID EXEFunc()

   PVOID pv = DLLFunc(); 
   //Access the storage pointed to by pv... 
   //Assumes that pv is in EXE's C/C++ run-time heap 
   free(pv);

 
PVOID DLLFunc()

   //Allocate block from DLL's C/C++ run-time heap 
   return(malloc(100)); 

解释是:那么你是怎么看待这个问题的呢?上面这个代码能够正确运行吗? D L L函数分配的内存块是由E X E的函数释放的吗?答案是可能的。上面显示的代码并没有为你提供足够的信息。如果E X E和D L L都链接到D L L的C / C + +运行期库,那么上面的代码将能够很好地运行。但是,如果两个模块中的一个或者两个都链接到静态C / C + +运行期库,那么对free函数的调用就会失败

我的疑问是不都是从进程的堆中分配么,静态的c/c++库只不过是指在dll和exe都有份代码,难道他们是从不同的堆中分配的?
先行谢过!!

8 个解决方案

#1


1 自己做做试验咯~ :P

2 动态链接应该不会创建自己的堆

3 这个问题讨论过了:
http://community.csdn.net/Expert/topic/4446/4446791.xml?temp=.6249201

#2


Thanks
关于问题1,我已经明白了
过程是这样的
系统先把dll放在进程的地址空间内(貌似是等所有dll都放到地址空间后,do i right?),然后是初始化该dll的全局和静态变量,然后调用dllmain,然后是exe的全局和静态变量,最后是winmain。
问题2:我也认为动态链接不应该创建自己的堆,那么vc在freelibrary的时候做内存泄露检查有什么意义,反正整个程序也没跑完,可能我后面还会释放,不是么?

#3


但是你的dll有可能连接了其他的静态库啊,参见核心编程那段话

#4


1 上面正解

2 dll不会自创建堆,自己也不释放,由使用者决定

#5


to pomelowu:
对我的dll是动态链接到mfc的,而exe是使用标准windows库,在loadlibrary()后,紧接着freelibrary(),系统vc打出trace 说内存泄露,按你的意思是不是它和exe分别有两个堆,
否则vc打出trace也没什么意义。

#6


也就是说loadlibrary会产生一个堆,freebrary()也会消灭一个堆。

#7


loadlibrary不会创建堆的。我的意思是,动态连接不会产生新的堆,其实这个在核心编程上已经讲过,我上面提到的那个帖子里好像也讨论过。

#8


对于动态链接库,会共用一个堆

#1


1 自己做做试验咯~ :P

2 动态链接应该不会创建自己的堆

3 这个问题讨论过了:
http://community.csdn.net/Expert/topic/4446/4446791.xml?temp=.6249201

#2


Thanks
关于问题1,我已经明白了
过程是这样的
系统先把dll放在进程的地址空间内(貌似是等所有dll都放到地址空间后,do i right?),然后是初始化该dll的全局和静态变量,然后调用dllmain,然后是exe的全局和静态变量,最后是winmain。
问题2:我也认为动态链接不应该创建自己的堆,那么vc在freelibrary的时候做内存泄露检查有什么意义,反正整个程序也没跑完,可能我后面还会释放,不是么?

#3


但是你的dll有可能连接了其他的静态库啊,参见核心编程那段话

#4


1 上面正解

2 dll不会自创建堆,自己也不释放,由使用者决定

#5


to pomelowu:
对我的dll是动态链接到mfc的,而exe是使用标准windows库,在loadlibrary()后,紧接着freelibrary(),系统vc打出trace 说内存泄露,按你的意思是不是它和exe分别有两个堆,
否则vc打出trace也没什么意义。

#6


也就是说loadlibrary会产生一个堆,freebrary()也会消灭一个堆。

#7


loadlibrary不会创建堆的。我的意思是,动态连接不会产生新的堆,其实这个在核心编程上已经讲过,我上面提到的那个帖子里好像也讨论过。

#8


对于动态链接库,会共用一个堆