我知道在C ++中编写(动态)插件时,插件分配的内存也应该被插件解除分配。这通常同样适用于DLL。
以下假设:可执行文件,所有插件和所有依赖项(如Qt)将始终使用相同的编译器构建
由于像QString
这样的类使用浅拷贝和内部数据指针等机制:
如果插件将本地定义的QString
(浅)副本返回到可执行文件,并且副本超出可执行文件的范围,那么是否会在错误的进程中释放内存?
示例代码:
// Defined in a DLL which is loaded at runtime
class SamplePlugin : IPlugin
{
public:
QString getSomeStringData() const override
{
return "Hello World"
}
}
// Defined in the executable
void Test( PluginManager* pluginManager )
{
for( auto plugin : pluginManager->loadPlugins() )
{
auto stringData = plugin->getSomeStringData();
doSomethingWith( stringData )
} // stringData goes out of scope here - is this a problem?
}
答案 0 :(得分:3)
通常,如果:
,2个Dll可以共享对象由一个人分配的内存可能被另一个人安全删除(即他们共享相同的共享运行时[以及任何其他依赖库])。
两者中的代码都使用相同的编译器和兼容的编译器选项进行编译。
对象不依赖于共享库本地的任何静态,或
对象已根据需要标记为DllExport / Import。
请注意,即使满足以上所有条件,并且2个Dll中的对象依赖于相同的静态库,您也可能会遇到问题(如果该静态库具有带全局链接的状态,例如静态变量)。