代码之家  ›  专栏  ›  技术社区  ›  Benj

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

  •  4
  • Benj  · 技术社区  · 12 年前

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

    今天,我正在设计一个新的界面 std::move std::vector<std::wstring> 从一个对象到另一个对象,其中对象是在不同的DLL中创建的。当我想到这可能意味着 删去 现在可能出现在与 因为现在有一个不同的对象拥有底层指针。

    有人能证实是不是这样吗?

    1 回复  |  直到 12 年前
        1
  •  4
  •   Nicol Bolas    12 年前

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

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

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