将 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_n
或 std::uninitialized_copy
( 这将在内部进行布局构造。当您需要将多个对象复制构造到未初始化的内存中时,这很方便。示例对于您的单个对象:
std::uninitialized_copy_n(&b, 1, a);
我必须使用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_n
或 std::uninitialized_copy
( 这将在内部进行布局构造。当您需要将多个对象复制构造到未初始化的内存中时,这很方便。示例对于您的单个对象:
std::uninitialized_copy_n(&b, 1, a);