用实例证明dll中new的内存不能在exe中释放
2013-10-30 22:24
405 查看
VC中新建一个dll工程,设置使用“多线程调试DLL (/MDd)”。该dll导出以下alloc函数:
VC中新建一个exe工程,设置使用“多线程调试(/MTd)”,并且引用刚才的dll工程,该工程的main函数如下:
运行以上程序可以发现两个现象:
1. dll和exe中打印出来的malloc函数的地址不同。原因是:dll是动态链接C运行库,exe是静态链接C运行库,因此最终的进程有两份malloc函数的代码。
2. delete[] p语句在运行的时候报错。原因是:既然malloc代码地址有两份,可以知道两个C运行库中的全局变量也有两份,维护堆的数据结构也有两份,那么一个C运行库new出来的地址,在另一个C运行库中不会有记录,也就不能去delete。
__declspec( dllexport ) int* alloc() { printf("in dll: %p\n", malloc); return new int[100]; }
VC中新建一个exe工程,设置使用“多线程调试(/MTd)”,并且引用刚才的dll工程,该工程的main函数如下:
__declspec( dllimport ) int* alloc(); int _tmain(int argc, _TCHAR* argv[]) { printf("in Main: %p\n", malloc); int* p = alloc(); delete[] p; return 0; }
运行以上程序可以发现两个现象:
1. dll和exe中打印出来的malloc函数的地址不同。原因是:dll是动态链接C运行库,exe是静态链接C运行库,因此最终的进程有两份malloc函数的代码。
2. delete[] p语句在运行的时候报错。原因是:既然malloc代码地址有两份,可以知道两个C运行库中的全局变量也有两份,维护堆的数据结构也有两份,那么一个C运行库new出来的地址,在另一个C运行库中不会有记录,也就不能去delete。
相关文章推荐
- 用实例证明dll中new的内存不能在exe中释放
- 用实例证明dll中new的内存不能在exe中释放
- DLL中用malloc分配了一块内存,但是在exe程序中释放引发的错误:其原因可能是堆被损坏,这也说明 **.exe 中或它所加载的任何 DLL 中有 bug。
- DLL分配的内存如何在EXE里面释放
- 跨module(exe、dll)间传递c++对象发生申请/释放内存违例的问题
- DLL中用malloc分配了一块内存,但是在exe程序中释放引发的错误:其原因可能是堆被损坏,这也说明 **.exe 中或它所加载的任何 DLL 中有 bug
- 在DLL中用CRT静态库申请内存,EXE释放是不行的
- exe中用new一块内存,但是在dll程序中delete引发的错误
- 用vs2008写了一个动态库,其中有申请内存,用vc6.0写了一个exe调用动态库,并释放dll申请的内存:dbgheap.c Line:1011
- DLL中用malloc分配了一块内存,但是在exe程序中释放引发的错误:其原因可能是堆被损坏,这也说明 **.exe 中或它所加载的任何 DLL 中有 bug。
- DLL中用malloc分配了一块内存,但是在exe程序中释放引发的错误可能原因
- 动态库中申请的内存不能在EXE中释放
- DLL与EXE之间的内存 new 与 delete 上的问题
- exe中用new一块内存,但是在dll程序中delete引发的错误
- DLL与EXE之间的内存 new 与 delete 上的问题
- 在DLL中用CRT静态库申请内存,EXE释放是不行的
- EXE中释放DLL中分配的内存
- DLL与EXE之间的内存 new 与 delete 上的问题
- 函数中new的内存的释放实例
- DLL分配的内存如何在EXE里面释放