我知道在用 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?
}
最佳答案
一般来说,2 个 Dll 可以共享对象如果:
一个分配的内存可以被另一个安全地删除(即它们共享相同的共享运行时[和任何其他依赖库])。
两者中的代码都是使用相同的编译器和兼容的编译器选项编译的。
对象不依赖于共享库本地的任何静态,或者
对象已根据需要标记为 DllExport/Import。
请注意,即使满足上述所有条件,并且 2 个 Dll 中的对象依赖于同一个静态库,您也可能会遇到问题(如果该静态库具有全局链接的状态,例如静态变量)。
关于c++ - 假设使用相同的编译器,像 QString 这样的类是否可以安全地跨 DLL 边界传输?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39512848/