我必须使用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);
将自定义类复制到未初始化的内存是否安全?
感谢
答案 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_n
或std::uninitialized_copy
(这将在内部进行放置构建。当您需要将多个对象复制 - 构建到未初始化的内存中时,这很方便。单个对象:
std::uninitialized_copy_n(&b, 1, a);