调试断言失败 - debug_heap.cpp:996
Debug assertion failed - 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 对象时,该错误不存在 app.I 发现了类似的 但错误消息略有不同。核心应用程序和插件的代码生成 属性 如下所示:
Runtime Library
记录设置为 different options
加粗字体是什么意思?我应该如何在核心应用程序和插件中设置 Runtime Library
来解决问题?
要查看您实际使用的运行时库,您只需要 select 从下拉列表中选择一个平台和配置(您正在为其构建的平台和配置)。对于您的应用程序和您的插件,运行时库需要是多线程 DLL(或用于调试构建的多线程调试 DLL),并且您正在构建的配置(调试或发布)也需要匹配。
The memory allocation takes places when a plugin calls the function but deallocation is performed in the core app.
这很脆弱。如果可以的话,我建议在插件中分配和取消分配,或者在应用程序中同时分配和取消分配。
我用的是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 对象时,该错误不存在 app.I 发现了类似的
Runtime Library
记录设置为 different options
加粗字体是什么意思?我应该如何在核心应用程序和插件中设置 Runtime Library
来解决问题?
要查看您实际使用的运行时库,您只需要 select 从下拉列表中选择一个平台和配置(您正在为其构建的平台和配置)。对于您的应用程序和您的插件,运行时库需要是多线程 DLL(或用于调试构建的多线程调试 DLL),并且您正在构建的配置(调试或发布)也需要匹配。
The memory allocation takes places when a plugin calls the function but deallocation is performed in the core app.
这很脆弱。如果可以的话,我建议在插件中分配和取消分配,或者在应用程序中同时分配和取消分配。