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

Is it safe to copy a class into uninitialized memory?

本文关键字:内存 是否 安全 初始化 复制      更新时间:2023-10-16

我必须使用malloc来分配内存。我有一个需要自定义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;
}

我知道我也可以使用新的展示位置:

a = new (a) A(b);

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

谢谢

放置新是正确的

A& operator=(const A& other)与非构造的"this"一起使用是不正确的(想象一下,如果你有一个非平凡的类型作为std::string A影响应该在影响新值之前销毁一个未初始化的字符串(。

完成新的放置后,您可以使用分配。

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

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

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

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

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