0

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

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

a = new (a) A(b);

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

谢谢

4

3 回答 3

5

放置新是正确的

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

一旦你做了新的安置,你可以使用分配。

auto p = new (a) A;
*p = b; // ok
于 2018-04-30T12:33:56.387 回答
0

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

于 2018-04-30T12:38:19.130 回答
0

正如已经回答的那样,对不存在的对象进行复制分配(或任何成员函数)是不行的。

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

std::uninitialized_copy_n(&b, 1, a);
于 2018-04-30T12:59:02.230 回答