析构函数崩溃

bjs*_*123 8 c++ destructor

我正在Visual Studio中使用Win32 c ++应用程序.

在其中一个源文件中,我有如下的全局对象.

TestClass tObj;

int main() //Execution starts here
{
}
Run Code Online (Sandbox Code Playgroud)

TestClass在下面的其他DLL中定义.

struct Source
{

};

class TestClass
{
  list<Source> sourceList;
    public:
         TestClass() {}
        ~TestClass() {}
};
Run Code Online (Sandbox Code Playgroud)

当我的应用程序运行时,如果我尝试通过关闭控制台窗口显式关闭应用程序,它将在TestClass析构函数中崩溃.Callstack显示CrtIsValidHeapPointer失败.

请帮我解决这个问题.

Joe*_*oeG 9

您的问题是.exe和.dll之间不同的编译器/链接器设置有效地导致.dll和.exe使用标准库的不同实现:

  • 您必须使用相同的预处理程序标志*来构建.exe和.dll,否则每个二进制文件将使用微妙的不同实现进行编译.
  • 您必须将.exe和.dll都链接到动态运行时.静态链接到运行时的二进制文件获取它们自己的堆 - 并且最终在一个堆上分配并尝试释放另一个堆.

要解决此问题,请转到Project > Properties > Configuration Properties > C/C++ > Code Generation并将运行时库选项更改为Multi-threaded Debug DLL (/MDd).您必须为.exe项目和.dll项目执行此操作.

从Visual Studio 2010开始,将使用#pragma detect_mismatch在链接时检测到某些类型的错误.

*对于具有标准库实现任何影响的所有预处理程序标志


sbi*_*sbi 4

确保使用相同的运行时(最好是动态运行时)构建 bot、EXE 和 DLL。