我使用的是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);
}
当插件调用函数时进行内存分配,但deallocation是在核心应用中进行的。这导致关闭应用程序后出现以下错误。
当我只在核心应用中使用T对象时,这个错误就不存在了。课题 但有一个错误信息是有点不同的。核心应用和插件的一个代码生成属性是这样的。
这意味着什么?Runtime Library
记录设置为 different options
用粗体字?我应该如何设置 Runtime Library
在核心应用和插件中解决这个问题?
要查看你实际使用的是什么运行时库,你只需要从下拉菜单中选择一个平台和配置(你正在构建的那些)。 你的应用和你的插件的运行时库都需要是多线程DLL(或Debug构建的多线程Debug DLL),你正在构建的配置(Debug或Release)也需要匹配。
当插件调用函数时,内存分配就会发生,但deallocation是在核心应用中进行的。
这是很脆弱的。 如果你能安排的话,我建议在插件中同时进行分配和deallocating,或者在app中同时进行。