c++ - 调试断言失败 - 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
在核心应用程序和插件中设置来解决问题?
解决方案
要查看您实际使用的运行时库,您只需从下拉列表中选择一个平台和配置(您正在构建的那些)。您的应用程序和插件的运行时库需要是多线程 DLL(或用于调试构建的多线程调试 DLL),并且您正在构建的配置(调试或发布)也需要匹配。
内存分配发生在插件调用函数但在核心应用程序中执行释放时。
这是脆弱的。如果可以安排的话,我会建议在插件中分配和解除分配,或者在应用程序中同时分配和解除分配。
推荐阅读
- printing - Arduino 打印语法序列 << '[' << RSP_SUCCESS << ']' << endl;
- php - Laravel 5中序列化base64编码的MySql列值的WhereIn
- bash - 如何使用 2 个文件读取变量
- excel - Apache POI Excel:同一列中的多个数据验证
- java - 为什么选择 SerialGC 而不是 G1GC?
- python - 如何减少python代码中的嵌套if语句
- javascript - 使用纯 JavaScript 修复了带有垂直和水平滚动条的表头
- python - 阅读文档搜索损坏
- php - 查询的sql之间添加UNION不为空
- ruby-on-rails - Styles do not work after converting from erb to slim