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 动态链接应该不会创建自己的堆
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的时候做内存泄露检查有什么意义,反正整个程序也没跑完,可能我后面还会释放,不是么?
关于问题1,我已经明白了
过程是这样的
系统先把dll放在进程的地址空间内(貌似是等所有dll都放到地址空间后,do i right?),然后是初始化该dll的全局和静态变量,然后调用dllmain,然后是exe的全局和静态变量,最后是winmain。
问题2:我也认为动态链接不应该创建自己的堆,那么vc在freelibrary的时候做内存泄露检查有什么意义,反正整个程序也没跑完,可能我后面还会释放,不是么?
#3
但是你的dll有可能连接了其他的静态库啊,参见核心编程那段话
#4
1 上面正解
2 dll不会自创建堆,自己也不释放,由使用者决定
2 dll不会自创建堆,自己也不释放,由使用者决定
#5
to pomelowu:
对我的dll是动态链接到mfc的,而exe是使用标准windows库,在loadlibrary()后,紧接着freelibrary(),系统vc打出trace 说内存泄露,按你的意思是不是它和exe分别有两个堆,
否则vc打出trace也没什么意义。
对我的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 动态链接应该不会创建自己的堆
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的时候做内存泄露检查有什么意义,反正整个程序也没跑完,可能我后面还会释放,不是么?
关于问题1,我已经明白了
过程是这样的
系统先把dll放在进程的地址空间内(貌似是等所有dll都放到地址空间后,do i right?),然后是初始化该dll的全局和静态变量,然后调用dllmain,然后是exe的全局和静态变量,最后是winmain。
问题2:我也认为动态链接不应该创建自己的堆,那么vc在freelibrary的时候做内存泄露检查有什么意义,反正整个程序也没跑完,可能我后面还会释放,不是么?
#3
但是你的dll有可能连接了其他的静态库啊,参见核心编程那段话
#4
1 上面正解
2 dll不会自创建堆,自己也不释放,由使用者决定
2 dll不会自创建堆,自己也不释放,由使用者决定
#5
to pomelowu:
对我的dll是动态链接到mfc的,而exe是使用标准windows库,在loadlibrary()后,紧接着freelibrary(),系统vc打出trace 说内存泄露,按你的意思是不是它和exe分别有两个堆,
否则vc打出trace也没什么意义。
对我的dll是动态链接到mfc的,而exe是使用标准windows库,在loadlibrary()后,紧接着freelibrary(),系统vc打出trace 说内存泄露,按你的意思是不是它和exe分别有两个堆,
否则vc打出trace也没什么意义。
#6
也就是说loadlibrary会产生一个堆,freebrary()也会消灭一个堆。
#7
loadlibrary不会创建堆的。我的意思是,动态连接不会产生新的堆,其实这个在核心编程上已经讲过,我上面提到的那个帖子里好像也讨论过。
#8
对于动态链接库,会共用一个堆