移动构造位置为new的对象
move-construct object with placement new
是不是UB移动构造一个对象通过放置新的?
假设我有这样的代码:
class Foo {
public:
Foo() { foo_ = new int; }
~Foo() { delete foo_; }
Foo(Foo &&f) {
foo_ = std::swap(f.foo_, foo_);
}
private:
int* foo_;
}
void bar() {
void* pMem = malloc(sizeof(Foo));
Foo f1;
// move-construct with placement new:
new((Foo*)pMem) Foo(std::move(f1)); // f2 in *pMem
// now f1 will contain a pointer foo_ of undefined value
// when exiting scope f1.~Foo(){} will exhibit UB trying to delete it
}
如果不明显,在通过放置new和move构造第二个foo之后,f1的成员foo_将有一个未定义的值(这个未定义的值来自未初始化的foo f2的foo_在其move构造函数中,因为值是交换的)
因此,当退出bar()的作用域时,f1的析构函数将尝试删除一个无效(未初始化)的指针。
这与位置new无关。这段代码会有完全相同的问题:
void bar() {
Foo f1;
Foo f2(std::move(f1));
}
每个构造的对象最终都会被析构,所以不管你是否使用place -new,你的move-构造函数都会因为让move- from对象处于无效状态而出错。从一个对象移动并不意味着它不会被破坏。它将。当你离开一个有效的对象时,你必须让它留在后面。
Foo(Foo &&f) : foo_(nullptr) {
std::swap(f.foo_, foo_);
}
相关文章:
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 传递给放置 new 的指针是否是指向其对象表示形式的非 UB 指针?
- 如何在不使用new的情况下保持在其他对象中创建的对象存活?
- 为什么销毁被放置 new 覆盖的对象不是未定义的行为?
- 如何分配适合容纳 T 类型对象的缓冲区(可能过度对齐、可能有运算符 new 等)
- 如何在不使用 "new" 关键字的情况下解除分配创建的对象的内存?
- 如何影响由 new 和强制转换为数组 od 类对象的内存?
- 双指针在使用 new 时不调用对象构造函数
- 使用 new in C++(在 Windows 上)分配大于 2GB 的单个对象
- 编译器是否在由 new 初始化的对象上调用隐式析构函数
- 从主函数中删除在另一个函数中使用 new 创建的一系列对象
- 供应商是否将 new 和 malloc 实现为小型对象分配器
- 函数是否应返回"new"对象
- 为什么我的对象似乎在不使用new”的情况下在堆上
- 使用放置 new 覆盖内存中的对象
- 使用 new: "potentially uninitialized pointer"将对象数组动态分配给指针
- 显式调用"运算符 new"后无法访问对象的函数
- 在new对象中强制转换指针
- c++的NEW对象作为参数(和Java一样)