将 class 复制到未初始化的内存中是否安全?

Is it safe to copy a class into uninitialized memory?

我必须使用malloc 来分配内存。我有一个自定义 class,需要一个自定义 operator=。假设它是 A:

class A {
public:
  int n;
  A(int n) : n(n) {}
  A& operator=(const A& other) {
   n = other.n;
   return *this;
  }
};

我用malloc分配内存:

int main() {
   A* a = (A*) malloc(sizeof(A));
   A b(1);

   //Is it safe to do this as long as I copy everything in operator=?
   *a = b;

   //Clean up
   a->~A();
   free(a);
   return 0;
}

我知道我也可以使用 placement new:

a = new (a) A(b);

将自定义 class 复制到未初始化的内存是否安全?

谢谢

新位置正确

A& operator=(const A& other) 与非构造的“this”一起使用是不正确的(想象一下,如果您在 A 中有一个非平凡的类型 std::string,那么矫揉造作应该会破坏一个影响新值之前未初始化的字符串)。

完成新的放置后,就可以使用赋值了。

auto p = new (a) A;
*p = b; // ok

不,"safe" 不应该这样做。赋值运算符将其参数复制到 现有对象 中。 构造函数 将原始内存转换为对象。当您处理原始内存时,您没有对象,因此分配给它没有任何意义。您必须 使用构造函数。所以,放置新的是要走的路。

如前所述,在不存在的对象上复制赋值(或任何成员函数)是不可行的。

除了 placement new 之外,您还可以调用 std::uninitialized_copy_nstd::uninitialized_copy( 这将在内部进行布局构造。当您需要将多个对象复制构造到未初始化的内存中时,这很方便。示例对于您的单个对象:

std::uninitialized_copy_n(&b, 1, a);