DLL中申请的内存调用DLL的进程能释放它吗? DLL中申请的内存调用DLL的进程能释放它吗?调用DLL的进程申请的内存DLL中能释放它吗?也就是说,DLL中相关内存所用的堆与调用DLL的进程所使用的堆是同一个吗?不懂,请教! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 应该是可以释放的。因为dll被进程调入其私有地址空间,是可以相互访问的。 这种方法不规范,最好是在DLL中增加一个相应的内存释放函数,在EXE中调用。如果dll用静态连接msvcrt.dll,那么dll的初始化代码会另外分配一个crt heap,如果用动态连接,就会用process原来的crt heap,exe的情况也一样。如果dll静态连接msvcrt.dll,就会有两个crt heap,那么dll中malloc的内存块对于exe的heap来说是非法的。因此并不能保证在dll中分配的内存在exe中能正确的释放。我们写dll的目的之一就是代码重用,这种方法不能保证别的exe能不能正确的使用dll的资源 不出错的情况,如果用了CRT的内存分配(new,delete,malloc,free,...),你的dll和exe是静态或动态连接CRT的时候必须一致。project settings->c/c++->code generation->use runtime library->dll和exe选择要一致 能不能释放取决于调用的程序和DLL的程序是不是同一种语言写的 vc调用delphi的dll释放不了dll申请的内存,dll申请的内存最好在dll内部释放,或者让dll提供释放函数进行释放。 可以是可以的dll和調用進程共享內存堆,不過容易出錯, 通过在dll中导出一个释放函数来释放 最好还是通过一个导出函数来释放dll中的内存,这样安全多了 最好还是通过一个导出函数来释放dll中的内存,这样安全多了 严重同意楼上 kingzai() “最好是在DLL中增加一个相应的内存释放函数,在EXE中调用。” 我想讨论的是能不能,不是规范与否。(前提是DLL与EXE同一种语言写的,是通过LOADLIBRARY这种显式调用DLL)我写了一个例子,不行,这不是规范与否的问题(不建议这样做并不能解释为什么不能这样做)。 可以的。可能Dll分配的内存块,应用程序释放,会报异常。用GlobalAlloc()代替new, 用GlobalFree() 代替delete就不会出错了其实还有一个办法,就是把dll的Settings的C/C++选项卡的Code Generation的Use Run-time liberary改成Debug Multithreaded DLL,在Release版本中改成Multithreaded DLL,就可以直接使用new和delete了 是不会的,DLL未被导出的数据,是被OS以映射文件的方式注入进程空间,而系统会做copy-on-write的操作,你分配的内存是在特定的进程空间,分配的堆也是属于进程的,这样,当出现进程切换的时候,OS通过TSS将CRC3里面的数据进行了保存和写入,也就是物理内存的映射方式已经改变,没有问题的。 OnCtlColor这个东西谁来帮我解释下,我菜鸟~~ vc mfc 工具栏变灰 关于CSocket的发送和接收的问题 怎样向界面线程传入参数? 标尺的设计方案(窗口还是视图)? 到底哪里有XP DDK下载呀 Http代理服务器怎样实现SSL或指点一下 各位!快来说说,哪些作者写的书比较好??? 不知debug和release模式各有什么用? 想做浏览器插件,实现本地文件的读写 请教高手: 向RichEdit控件发送SET_TEXT消息往里写内容的问题!有的能写进去内容,有的却写不进去? 问两个较弱的问题?有关EDIT编辑框和界面最小化。(10分)
因为dll被进程调入其私有地址空间,是可以相互访问的。
如果dll用静态连接msvcrt.dll,那么dll的初始化代码会另外分配一个crt heap,如果用动态连接,就会用process原来的crt heap,exe的情况也一样。如果dll静态连接msvcrt.dll,就会有两个crt heap,那么dll中malloc的内存块对于exe的heap来说是非法的。因此并不能保证在dll中分配的内存在exe中能正确的释放。我们写dll的目的之一就是代码重用,这种方法不能保证别的exe能不能正确的使用dll的资源
dll和調用進程共享
內存堆,
不過容易出錯,
“最好是在DLL中增加一个相应的内存释放函数,在EXE中调用。”
(前提是DLL与EXE同一种语言写的,是通过LOADLIBRARY这种显式调用DLL)我写了一个例子,不行,这不是规范与否的问题(不建议这样做并不能解释为什么不能这样做)。
用GlobalAlloc()代替new, 用GlobalFree() 代替delete就不会出错了
其实还有一个办法,就是把dll的Settings的C/C++选项卡的Code Generation的Use Run-time liberary改成Debug Multithreaded DLL,在Release版本中改成Multithreaded DLL,就可以直接使用new和delete了