在DLL边界上使用std::move是一种好的做法吗
Is it good practice to use std::move over a DLL boundary?
任何在Windows上使用过DLL的人都会告诉你,在DLL边界的一侧new
对象,然后在另一侧delete
对象是个坏主意。通常使用带有DLL的工厂方法来避免这种情况,以便执行新/删除的对象代码出现在同一对象文件中。
今天,我正在设计一个新的接口,我想从一个对象到另一个对象std::move
和std::vector<std::wstring>
,其中对象是在不同的DLL中创建的。当我想到这可能意味着delete
现在可能出现在与new
不同的对象代码中时,我已经做好了这样做的准备,因为不同的对象现在拥有底层指针。
有人能证实情况是否如此吗?
通常,唯一应该跨越DLL边界的对象是那些析构函数(和复制构造函数/赋值)作用不大的对象。最好,为了最大限度的安全性,应该只使用POD(从而允许两个DLL进行接口,即使它们不是用完全相同的编译器的完全相同版本编译的)。
至于移动会发生什么,是的,接收DLL将解除分配由提供DLL分配的内存。这通常属于"不好"阵营。
如果你想确保它的安全,你可以使用特殊的分配器来分配(和释放)来自接收DLL的内存。但这通常很烦人。
相关文章:
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 有没有一种方法可以在编译时获得作用域类名
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- 一种在C++中读取TXT配置文件的简单方法
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 在调用接收数组的方法时,模板化数组大小是不是一种糟糕的做法
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 将错误返回给调用方而不是立即在 C++ 中抛出错误是否是一种好的做法
- 在 c++ 中,有一种方法可以创建一个包含地图作为值的树状地图?
- 有没有一种优雅而快速的方法来测试整数中的 1 位是否位于连续区域
- 在运行时检查继承是否只有一种类型和 void*
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 找到一种有效的方法,在 2 个巨大的缓冲区上执行 MAX,每字节字节
- 在DLL边界上使用std::move是一种好的做法吗
- 关于指针对齐,有没有一种方法可以使指针与给定的内存边界对齐