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

时间:2016-09-15 13:51:15

标签: c++ qt memory-management dll

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

1 个答案:

答案 0 :(得分:3)

通常,如果:

,2个Dll可以共享对象
  1. 由一个人分配的内存可能被另一个人安全删除(即他们共享相同的共享运行时[以及任何其他依赖库])。

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

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

  4. 对象已根据需要标记为DllExport / Import。

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