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

标签 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?
}

最佳答案

一般来说,2 个 Dll 可以共享对象如果:

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

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

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

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

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

关于c++ - 假设使用相同的编译器,像 QString 这样的类是否可以安全地跨 DLL 边界传输?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39512848/

相关文章:

c++ - 将类型导出到 python

javascript - 是否可以从 qml 访问 QScriptValue 中持有 QVariantMap 的任何内容?

c++ - QTimer 根本不准确?

c++ - 我应该返回对堆对象的引用还是返回值?

c++ - 将本地 OpenCV Mat 变量声明为静态变量以防止重新分配

c++ - while(!(cin >> x)) 如何重新提示输入

c++ - 如何测试类 B 是否派生自类的模板族

用于参数分派(dispatch)的 C++ 模板元编程

c++ - Qt 的 Bullseye 代码覆盖率

linux 64位内存空间大小?