今日、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
}