CRT虚拟析构函数

Poi*_*box 6 c++ crt visual-studio-2010 virtual-destructor

今天我遇到了由我的dll和我的实际项目中的不同CRT设置(MTd MDd)引起的堆损坏.我发现奇怪的是,当我将dll中的析构函数设置为虚拟时,应用程序才崩溃.对此有一个简单的解释吗?我知道我无法释放那些不在我堆上的内存,但是当我将析构函数定义为非虚拟时,区别在哪里.

一些代码只是为了让它更清晰一点

DLL

#pragma once
class CTestClass
{
public:
    _declspec(dllexport) CTestClass() {};
    _declspec(dllexport) virtual ~CTestClass() {};
};
Run Code Online (Sandbox Code Playgroud)

而我的项目

int main(int argc, char* argv[])
{
    CTestClass *foo = new CTestClass;
    delete foo; // Crashes if the destructor is virtual but works if it's not
}
Run Code Online (Sandbox Code Playgroud)

Ala*_*ton 2

之间存在差异

class CTestClass
{
public:
    _declspec(dllexport) CTestClass() {}
    _declspec(dllexport) virtual ~CTestClass() {}
};
Run Code Online (Sandbox Code Playgroud)

__declspec(dllexport) class CTestClass
{
public:
     CTestClass() {}
     virtual ~CTestClass() {}
};
Run Code Online (Sandbox Code Playgroud)

在前一种情况下,您指示编译器仅导出两个成员函数:CTestClass::CTestClass() 和 CTestClass::~CTestClass()。但在后一种情况下,您还可以指示编译器导出虚函数表。一旦你有了虚拟析构函数,就需要这个表。所以这可能是事故的原因。当您的程序尝试调用虚拟析构函数时,它会在关联的虚拟函数表中查找它,但它没有正确初始化,因此我们不知道它真正指向哪里。如果您的析构函数不是虚拟的,那么您不需要任何虚拟函数表,一切都会正常工作。