这是个很典型的问题,在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里面的函数TestOriginalPointer尝试去delete的时候,就crash了。再来看个例子:
创建一个class来传递一段内存