将类复制到未初始化的内存中是否安全?
Is it safe to copy a class into uninitialized memory?
我必须使用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_n
或std::uninitialized_copy
(这将在内部进行放置构造。当您需要将多个对象复制构造到未初始化的内存中时,这很方便。单个对象的示例:
std::uninitialized_copy_n(&b, 1, a);
相关文章:
- 我在 IDA 或 dbg 或 olly 上看到的内存是否与我在 RAM 上实时加载的内存相同?
- 访问"std::vector"的保留但未调整大小的内存作为原始内存是否安全?
- 本地分配的内存是否可以用于将来使用?
- 多次分配内存是否一次性需要更多时间?
- 删除矢量的尾部(通过擦除)内存是否有效
- 如何找出内存是否属于堆或堆栈
- C++:提升:托管共享内存是否需要信号量锁
- 在 C/C++ 中在特定地址边界上对齐内存是否仍能提高 x86 性能?
- 检查内存是否在堆上
- C++内存 - 是否需要删除使用 'new' 创建的基元类型变量?
- 如果通过委托给“malloc”的重载“new[]”分配,“释放”内存是否安全
- 分配给 cpp 中定义的全局静态变量的内存是否在 C++ 中删除其类的实例后释放
- 我的 265GB RAM 笔记本电脑上的内存是否超过 8GB
- 在动态内存分配中,在程序终止并且忘记释放内存后,该内存是否保持分配状态
- 这些二维数组(C++)的内存是否不足
- 如果我在 for 中声明一个对象,它的内存是否会在那之后被释放?
- 二进制搜索树(如何在插入时检查内存是否不足)
- 用new重新分配内存是否安全
- 在构造函数初始化列表中分配内存是否存在任何问题
- 内存映射内存是否可能