首页 > 解决方案 > 调试断言失败 - debug_heap.cpp:996

问题描述

我使用 Visual Studio 2017。我有一个多项目解决方案 (c++)。有一个创建可执行文件(核心应用程序)的项目和一个创建动态库(插件)的项目。LoadLibrary核心应用程序在运行时使用和GetProcAddress函数加载插件。核心应用程序定义了一个包含地图的对象,这是一个简化的定义:

class T
{
public:
    void fun(const std::string& key)
    {
        ++data_[key];
    }
private:
    std::map<std::string, int> data_;
};

T 对象在核心应用程序中静态定义并在插件中注册(通过指针),它以这种方式使用它:

void Plugin::fun()
{
    t->fun(key);
}

内存分配发生在插件调用函数但在核心应用程序中执行释放时。关闭应用程序后导致以下错误:

在此处输入图像描述

当我仅从核心应用程序中使用 T 对象时,该错误不存在。我发现了一个类似的主题,但错误消息有点不同。核心应用程序和插件的代码生成属性如下所示:

在此处输入图像描述

Runtime Library记录设置为different options粗体是什么意思?我应该如何Runtime Library在核心应用程序和插件中设置来解决问题?

标签: c++visual-studio-2017

解决方案


要查看您实际使用的运行时库,您只需从下拉列表中选择一个平台和配置(您正在构建的那些)。您的应用程序和插件的运行时库需要是多线程 DLL(或用于调试构建的多线程调试 DLL),并且您正在构建的配置(调试或发布)也需要匹配。

内存分配发生在插件调用函数但在核心应用程序中执行释放时。

这是脆弱的。如果可以安排的话,我会建议在插件中分配和解除分配,或者在应用程序中同时分配和解除分配。


推荐阅读