打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
DLL分配的内存如何在EXE里面释放?
不同的内存分配函数对应的内存分配位置(堆栈、heap)是不同的,岂能随便调用?如果一块内存不是COM申请的,怎么能用IMalloc释放?

    你用new申请的就要使用delete释放,使用malloc申请的就要使用free释放,这是基本常识。


    你的问题很容易解决。比如在DLL起始的时候,你使用new分配了一个数组pArray。然后,当不需要的时候,你的exe有一个函数想要释放这块内存(我没理解错吧),你可以在DLL中定义一个输出函数void FreeMem(){ delete[] pArray; },然后让exe的那个函数调用这个函数即可。

#5 得分:0 回复于: 2000-10-25 14:31:00
  如果只是单纯地分配和释放一块内存,只需将free和new替换为WINAPI中任意一对内存分配函数即可。WINAPI:FormatMessge()就是这样设计的,应该不会有问题。
  如果是动态地创建和释放类对象,问题就比较麻烦,一两句话不易说清。请参看MSDN中的“BUG: Wrong Operator Delete Called for Exported Class“这篇文章。
问题已经解决了,还是用那种麻烦的办法,从其中一个DLL导出一对函数。

我试了一下。从动态库导出函数  fa(char**p){ *p=new char[123] };
在exe文件中有如下代码:  
char* x=NULL;
fa(&x);
delete[] x;
发现不同的编译环境下运行结果不一样。

1. dll和exe 都用MFC Appwizard方式生成,那么运行时没有任何问题。如果把delete语句去掉,则VC报告内存泄漏 123 Bytes。说明一切正常。

2. 如果exe用 MFC Appwizard方式生成, dll用win32方式生成,则运行时会出现象你所说的错误。进一步用单步跟踪,发现mfc方式和win32方式下的new操作符是用不同方式实现的,源程序分别在VC目录的文件 Afxmem.cpp和new.cpp中。有兴趣的话可以自已跟踪一下。

因为dll输出函数后,并不知道是哪一个模拟调用它,因此new和delete配对时最好在一个文件中,这样可以保证一致性。就如你所说从dll中导出一对函数。
另一个解决方法是把dll和exe都用同一种方法编译(比如都用MFC方式)。我试了一下,把win32程序改为mfc程序并不困难。

希望对你有所帮助。

#8 得分:10 回复于: 2000-10-25 21:02:00
问题主要在于DLL和EXE主程序中分配内存的堆不一样,你可以不用NEW和DELETE,而是用::HeapAlloc(::GetProcessHeap(),...)和::HeapFree(::GetProcessHeap(),...)这两个API,这样无论在DLL中还是在主程序中都是在进程默认堆中分配,这样就不会出错了
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
delete与delete [] 真正区别
VLD(Visual LeakDetector)内存泄露库的使用
跨模块边界分配和释放内存
C静态存储区栈堆的区别(zz)_刘鸿宇
c/c++笔试题——C++中 new/delete 概念和用法总结
内存的申请与释放
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服