任何在Windows上使用过DLL的人都会告诉你,new
DLL边界一侧的对象然后delete
它是另一个坏主意。通常使用带有DLL的工厂方法来避免这种情况,以便执行新/删除的目标代码出现在同一个目标文件中。
今天,我正在设计一个新界面,我希望从一个对象std::move
std::vector<std::wstring>
到另一个对象,其中对象是在不同的DLL中创建的。当我发现这可能意味着delete
现在可能出现在new
以外的不同目标代码中,因为另一个对象现在拥有底层指针时,我已经准备好这样做。
任何人都可以确认是否是这种情况吗?
答案 0 :(得分:3)
通常,唯一应该跨越DLL边界的对象是析构函数(和复制构造函数/赋值)不会做太多的对象。最好只使用POD以获得最大安全性(因此即使它们没有使用完全相同的编译器完全相同的版本编译,也允许两个DLL接口)。
关于移动会发生什么,是的,接收DLL将释放由提供DLL分配的内存。这通常属于“不好”阵营。
如果要使其安全,可以使用从接收DLL分配(和解除分配)内存的特殊分配器。但这通常很烦人。