在DLL边界上使用std::move是一种好的做法吗

Is it good practice to use std::move over a DLL boundary?

本文关键字:一种 边界 DLL move std      更新时间:2023-10-16

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

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

有人能证实情况是否如此吗?

通常,唯一应该跨越DLL边界的对象是那些析构函数(和复制构造函数/赋值)作用不大的对象。最好,为了最大限度的安全性,应该只使用POD(从而允许两个DLL进行接口,即使它们不是用完全相同的编译器的完全相同版本编译的)。

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

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

相关文章: