任何在 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/