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() {};
};
而我的项目
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 CTestClass
{
public:
    _declspec(dllexport) CTestClass() {}
    _declspec(dllexport) virtual ~CTestClass() {}
};
和
__declspec(dllexport) class CTestClass
{
public:
     CTestClass() {}
     virtual ~CTestClass() {}
};
在前一种情况下,您指示编译器仅导出两个成员函数:CTestClass::CTestClass() 和 CTestClass::~CTestClass()。但在后一种情况下,您还可以指示编译器导出虚函数表。一旦你有了虚拟析构函数,就需要这个表。所以这可能是事故的原因。当您的程序尝试调用虚拟析构函数时,它会在关联的虚拟函数表中查找它,但它没有正确初始化,因此我们不知道它真正指向哪里。如果您的析构函数不是虚拟的,那么您不需要任何虚拟函数表,一切都会正常工作。
| 归档时间: | 
 | 
| 查看次数: | 622 次 | 
| 最近记录: |