我正在 Visual Studio 中开发 Win32 c++ 应用程序。
在其中一个源文件中,我有如下所示的全局对象。
TestClass tObj;
int main() //Execution starts here
{
}
TestClass 在其他 DLL 中定义,如下所示。
struct Source
{
};
class TestClass
{
list<Source> sourceList;
public:
TestClass() {}
~TestClass() {}
};
当我的应用程序正在运行时,如果我尝试明确关闭该应用程序, 通过关闭控制台窗口,它在 TestClass 析构函数中崩溃。 Callstack 显示 CrtIsValidHeapPointer 失败。
请帮我解决这个问题。
最佳答案
您的问题是 .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 检测到其中一些此类错误.
*对于所有对标准库实现有任何影响的预处理器标志
关于c++ - 析构函数崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3475371/