不同的内存分配函数对应的内存分配位置(堆栈、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中还是在主程序中都是在进程默认堆中分配,这样就不会出错了
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。