gpt4 book ai didi

c++ - 使用 new 放置移动构造对象

转载 作者:搜寻专家 更新时间:2023-10-31 00:30:08 24 4
gpt4 key购买 nike

通过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
}

如果不是很明显,f1 的成员 foo_ 在通过 placement new 和 move 构造构造第二个 foo 后将有一个未定义的值(这个未定义的值来自未初始化的 Foo f2 的 foo_ 在其移动构造函数中,因为值是 交换)

因此,当退出 bar() 的作用域时,f1 的析构函数将尝试删除无效(未初始化)的指针。

最佳答案

这与展示位置无关。此代码会遇到完全相同的问题:

void bar() {
Foo f1;
Foo f2(std::move(f1));
}

每个构造的对象最终都会被销毁,所以不管你是否使用 placement-new 都没有关系,你的移动构造函数会因为将移动对象留在无效状态而变得困惑.从对象移动并不意味着它不会被破坏。它会。当你离开一个有效的对象时,你必须让一个有效的对象在后面。

Foo(Foo &&f) : foo_(nullptr) {
std::swap(f.foo_, foo_);
}

将修复错误。

关于c++ - 使用 new 放置移动构造对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38171964/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com