这是个很典型的问题,在MSDN上也有描述。问题是这样的:
在一个DLL里面分配内存,然后在DLL的调用者EXE那里释放内存。
当DLL和EXE里面有一个是使用MT连接CRT的时候就有问题。如果DLL和EXE都使用MD,那么就没有问题。
先来看一下问题
直接使用原生指针来传递
在DLL里面创建一个导出函数,如:
void TestOriginalPointer(int** p)
{
delete *p;
int* temp = new int;
*temp = 1;
*p = temp;
}这段代码的意思就是将传进来的数据先删除,再从新分配一个。
调用者代码:
// test1
typedef void(*fTest)(int**);
fTest TestOriginalPointer = (fTest)GetProcAddress(h, "TestOriginalPointer");
int* p = new int;
*p = 0;
TestOriginalPointer(&p);
这个示例代码在DLL和EXE都是MD连接CRT的时候是没有问题,但是当有一个是MT的时候就crash。看一下调用堆栈

本文探讨了跨DLL的内存分配释放问题,当DLL与EXE使用不同CRT链接方式时可能导致Heap corruption。问题的根本原因是不同CRT中同一内存地址指向不同。解决方法包括避免DLL和EXE间交叉分配释放,以及使用虚函数确保分配和释放操作在同一CRT内进行。通过创建管理内存的类并利用虚函数,可以确保new和delete在相同CRT中执行,从而避免问题。
最低0.47元/天 解锁文章
781

被折叠的 条评论
为什么被折叠?



