DLL分配的内存如何在EXE里面释放
2014-05-27 17:45
302 查看
总结下面几个要点:1. 保证内存分配和清除的统一性:如果一个DLL提供一个能够分配内存的函数,那么这个DLL同时应该提供一个函数释放这些内存。数据的创建和清除应该在同一个层次上。曾经遇到过这样的例子:在dll中分配了一块内存,通过PostMessage将其地址传给应用。然后应用去释放它,结果总是报异常。2.如果exe用 MFC Appwizard方式生成, dll用win32方式生成,则运行时会出现错误。进一步用单步跟踪,发现mfc方式和win32方式下的new操作符是用不同方式实现的,源程序分别在VC目录的文件
Afxmem.cpp和new.cpp中。有兴趣的话可以自已跟踪一下。因为dll输出函数后,并不知道是哪一个模拟调用它,因此new和delete配对时最好在一个文件中,这样可以保证一致性。3. 问题主要在于DLL和EXE主程序中分配内存的堆不一样,你可以不用new和delete,而是用1) ::HeapAlloc(::GetProcessHeap(),...)和::HeapFree(::GetProcessHeap(),...)2) ::GlobalAlloc()和::GlobalFree()这两对API,这样无论在DLL中还是在主程序中都是在进程默认堆中分配,就不会出错了。4.
还有一个办法,就是把dll的Settings的C/C++选项卡的Code Generation的Use Run-time liberary改成Debug Multithreaded DLL,在Release版本中改成Multithreaded DLL,就可以直接使用new和delete了。不过MFC就不能用Shared模式了。
Afxmem.cpp和new.cpp中。有兴趣的话可以自已跟踪一下。因为dll输出函数后,并不知道是哪一个模拟调用它,因此new和delete配对时最好在一个文件中,这样可以保证一致性。3. 问题主要在于DLL和EXE主程序中分配内存的堆不一样,你可以不用new和delete,而是用1) ::HeapAlloc(::GetProcessHeap(),...)和::HeapFree(::GetProcessHeap(),...)2) ::GlobalAlloc()和::GlobalFree()这两对API,这样无论在DLL中还是在主程序中都是在进程默认堆中分配,就不会出错了。4.
还有一个办法,就是把dll的Settings的C/C++选项卡的Code Generation的Use Run-time liberary改成Debug Multithreaded DLL,在Release版本中改成Multithreaded DLL,就可以直接使用new和delete了。不过MFC就不能用Shared模式了。
相关文章推荐
- DLL分配的内存如何在EXE里面释放
- DLL分配的内存如何在EXE里面释放
- DLL中用malloc分配了一块内存,但是在exe程序中释放引发的错误:其原因可能是堆被损坏,这也说明 **.exe 中或它所加载的任何 DLL 中有 bug。
- EXE中释放DLL中分配的内存
- DLL中用malloc分配了一块内存,但是在exe程序中释放引发的错误可能原因
- 如何在Dll中分配内存,而在调用程序里释放
- DLL中用malloc分配了一块内存,但是在exe程序中释放引发的错误:其原因可能是堆被损坏,这也说明 **.exe 中或它所加载的任何 DLL 中有 bug。
- DLL中用malloc分配了一块内存,但是在exe程序中释放引发的错误:其原因可能是堆被损坏,这也说明 **.exe 中或它所加载的任何 DLL 中有 bug
- free如何知道释放内存长度:vs与glibc分配内存时编译器内部处理
- 用实例证明dll中new的内存不能在exe中释放
- DLL中内存的分配释放
- 如何释放sqlservr.exe所占用的内存?
- 如何释放sqlservr.exe所占用的内存?
- dll里面分配的空间一定要在dll里面释放吗
- 如何释放sqlserver.exe占用的内存
- 在DLL中用CRT静态库申请内存,EXE释放是不行的
- 用实例证明dll中new的内存不能在exe中释放
- 跨module(exe、dll)间传递c++对象发生申请/释放内存违例的问题
- (转)!!频繁分配释放内存导致的性能问题的分析 --(附)malloc分配原理浅析 mmap关注焦点 如何优化分配内存
- 用实例证明dll中new的内存不能在exe中释放