c++ - 在 DLL 边界上使用 std::move 是一种好习惯吗?

标签 c++ dll c++11

任何在 Windows 上使用过 DLL 的人都会告诉您,new 不是一个好主意。 DLL 边界一侧的对象,然后是 delete它在另一边。通常使用带有 DLL 的工厂方法来避免这种情况,以便执行新建/删除的目标代码出现在同一个目标文件中。

今天,我正在设计一个新界面,我想在其中 std::move一个std::vector<std::wstring>从一个对象到另一个对象是在不同的 DLL 中创建的。当我想到这可能意味着 delete 时,我已经准备好这样做了。现在可能出现在与 new 不同的目标代码中做了,因为一个不同的对象现在拥有底层指针。

任何人都可以确认是否是这种情况?

最佳答案

一般来说,唯一应该跨越 DLL 边界的对象是析构函数(和复制构造函数/赋值)不做太多事情的对象。最好只使用 POD 以获得最大的安全性(这样即使两个 DLL 不是使用完全相同的编译器的完全相同版本编译的,也允许它们进行交互)。

至于移动会发生什么,是的,接收 DLL 将释放由提供 DLL 分配的内存。这通常属于“不好”阵营。

如果您想确保安全,您可以使用特殊的分配器从接收 DLL 分配(和释放)内存。但这通常很烦人。

关于c++ - 在 DLL 边界上使用 std::move 是一种好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11558428/

相关文章:

c++ - 调用其他文件 undefined reference 的 header 中的函数

c++ - C++ 中的类型别名

c++ - 取消引用并通过引用返回

java - 如何从 Java 调用 Excel 电子表格中的 VBA 代码?

C++ DLL 链接器错误

c++ - 如何查看从 Matlab 中的 Mex 函数使用的 DLL 调用的 printf 的输出?

c++ - 用c++解决骑士之旅

C++ 信号量 (semi *lockfree*),我在哪里可以得到一个?

c++ 可以将字符串值转换为类型吗?

c++ - 试图初始化结构的构造函数中的初始化列表