假设使用相同的编译器,像QString这样的类可以安全地跨DLL边界传输吗?
Can classes like QString be safely transferred across DLL boundaries, assuming the same compiler?
我知道在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可以共享对象- 其中一个分配的
内存可以被另一个安全地删除(即它们共享相同的共享运行时[和任何其他依赖库])。
两者中的代码已使用相同的编译器和兼容的编译器选项编译。
对象不依赖于共享库本地的任何静态状态,或者
对象已适当标记为DllExport/Import。
请注意,即使满足上述所有条件,并且两个dll中的对象依赖于同一个静态库,您也可能会遇到问题(如果该静态库具有具有全局链接的状态,例如静态变量)。
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- 混合延迟 dll 加载和手动调用 LoadLibraryA 是否安全?
- 使用安全模式从DLL(通过(INTPTR)参数传递到该函数)获取char **
- 在运行时在v110可执行文件中使用v90 COM dll是否安全
- 从DLL返回std::wstring是否安全
- HANDLE(IntPtr)已过时,kernel32.dll,安全文件句柄到IntPtr
- 在mfc应用程序中使用win32 dll是否安全
- std::type_index在DLL之间是否安全
- 验证加载的DLL是否具有有效证书的最安全方法是什么
- 在跨dll/so的注入类中使用异常是否安全?
- 在跨DLL边界使用的类中将字符串用作私有数据成员是否安全?
- 安全的字符串复制超过DLL边界
- 在C++dll中导出以下哪种方法是安全的
- C++DLL中的线程安全字符串缓冲区变量
- 在安全模式下调用dll
- 将boost::variant传递给(来自)dll是否安全?
- 如果DLL将在多个平台上使用,那么在编码中使用windows依赖项是否安全?
- 从 Java 的多线程并行调用非线程安全的 DLL 函数