今天我遇到一个堆栈损坏的问题,是因为我的dll和实际项目中采用了不同的CRT设置(MTd MDd)。
我觉得奇怪的是,只有在将dll中的析构函数设置为虚函数时,应用程序才会崩溃。
这是为什么呢?我知道不能释放不在我的堆上的内存,但当我将析构函数定义为非虚函数时,究竟有什么区别?
以下是一些代码,以使问题更加明确。
DLL
我的项目
以下是一些代码,以使问题更加明确。
DLL
#pragma once
class CTestClass
{
public:
_declspec(dllexport) CTestClass() {};
_declspec(dllexport) virtual ~CTestClass() {};
};
我的项目
int main(int argc, char* argv[])
{
CTestClass *foo = new CTestClass;
delete foo; // Crashes if the destructor is virtual but works if it's not
}
class _declspec(dllexport) CTestClass {...}
),并删除每个成员的 declspec,是否会遇到相同的问题?只是好奇。请注意,调用代码和 DLL 应该使用相同的 CRT(调试或发布),因此这是需要考虑的事情。我甚至不确定混合模式是否受支持(我不认为它被支持)。 - WhozCraig