4

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

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

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

4

1 回答 1

4

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

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

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

于 2012-07-19T18:13:09.273 回答