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

时间:2012-07-19 10:03:52

标签: c++ dll c++11

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

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

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

1 个答案:

答案 0 :(得分:3)

通常,唯一应该跨越DLL边界的对象是析构函数(和复制构造函数/赋值)不会做太多的对象。最好只使用POD以获得最大安全性(因此即使它们没有使用完全相同的编译器完全相同的版本编译,也允许两个DLL接口)。

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

如果要使其安全,可以使用从接收DLL分配(和解除分配)内存的特殊分配器。但这通常很烦人。