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

时间:2018-04-30 12:28:27

标签: c++ copy copy-assignment

我必须使用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);

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

感谢

3 个答案:

答案 0 :(得分:5)

Placement new是正确的

使用 mylibrary = { my_variable: 0, my_function: function() { $.ajax({ url: "/theinternet", method: "POST", data: { // things }, success: function(response) { this.my_variable += 1; // How do I access my_variable? console.log("HOORAY!"); }, error: function(error) { console.log("ERROR"); } }); }.bind(this); } 与非构造的" A& operator=(const A& other)"是不正确的(假设你在this内有一个非平凡的类型std::string,那么在影响新值之前,做法应该销毁一个未初始化的字符串。)

您可以使用分配。

A

答案 1 :(得分:0)

不,这样做并不“安全”。赋值运算符将其参数复制到现有对象构造函数将原始内存转换为对象。当你处理原始内存时,你没有一个对象,所以分配给它没有任何意义。您必须使用构造函数。因此,新的布局是可行的方法。

答案 2 :(得分:0)

如前所述,对现有对象的复制分配(或任何成员函数)不正常。

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

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