假设使用相同的编译器,像QString这样的类可以安全地跨DLL边界传输吗?

Can classes like QString be safely transferred across DLL boundaries, assuming the same compiler?

本文关键字:安全 DLL 传输 边界 编译器 QString 假设      更新时间:2023-10-16

我知道在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?
}

通常,如果:

,两个dll可以共享对象
    其中一个分配的
  1. 内存可以被另一个安全地删除(即它们共享相同的共享运行时[和任何其他依赖库])。

  2. 两者中的代码已使用相同的编译器和兼容的编译器选项编译。

  3. 对象不依赖于共享库本地的任何静态状态,或者

  4. 对象已适当标记为DllExport/Import。

请注意,即使满足上述所有条件,并且两个dll中的对象依赖于同一个静态库,您也可能会遇到问题(如果该静态库具有具有全局链接的状态,例如静态变量)。