gpt4 book ai didi

c++ - 在基本构造函数完成之前传递 `this` : UB or just dangerous?

转载 作者:可可西里 更新时间:2023-11-01 15:39:17 25 4
gpt4 key购买 nike

考虑这个最小的例子(我能想到的):

struct Bar;

struct Foo {
Bar* const b;
Foo(Bar* b) : b(b) {}
};

struct Bar {
Foo* const f;
Bar(Foo* f) : f(f) {}
};

struct Baz : Bar {
Baz() : Bar(new Foo(this)) {}
};

当将 this 传递给 Foo 的构造函数时,Baz 的层次结构中没有任何内容被创建,但 FooBar 对它们接收到的指针做任何有问题的事情。

现在的问题是,以这种方式泄露 this 是危险的还是未定义的行为?

问题 2:如果 Foo::Foo(Bar*) 是具有相同语义的 Foo::Foo(Bar&) 会怎么样?我必须传递 *this,但 deref 运算符在这种情况下不会执行任何操作。

最佳答案

这不是 UB。该对象可能尚未正确初始化(因此可能无法立即使用它),但存储指针以备后用是可以的。

I would have to pass *this, but the deref operator wouldn't do anything in this case.

当然会,它会取消对指针的引用。请记住,初始化与分配不同——当构造函数运行时,对象已经正确分配(否则你将无法初始化它)——即它存在,但在其构造函数完成之前它处于不确定状态。

关于c++ - 在基本构造函数完成之前传递 `this` : UB or just dangerous?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8126713/

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