c++ - 析构函数崩溃

标签 c++ destructor

我正在 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/

相关文章:

c++ - 我如何才能始终强制包含标题?

c++ - std::initializer_list::size() 与 std::array::size() 的constexpr-ness

c++ - boost::text_oarchive 对象的序列化堆栈损坏

c++ - 将 Matlab 变量传输到 C

multithreading - 使用阻塞调用时如何退出程序

c++ - std::array 作为字段的语法是什么,里面的对象必须用带参数的 ctor 构造?

c++ Delete 像 QObject 一样从基类派生

c++ - 使用析构函数释放链接对象

c++ - 如何以可维护的方式为整个类层次结构保护析构函数?

使用 pop_back 的 C++ 析构函数