gpt4 book ai didi

c++ - 指向对象 X 的 weak_ptr 在对象 X 销毁期间是否仍然有效

转载 作者:行者123 更新时间:2023-11-27 23:51:25 25 4
gpt4 key购买 nike

我有类似于以下内容的内容:

class A {
std::weak_ptr<B> r;
A (std::weak_ptr<B> x) : r(x) {}

~A() {
r.lock();
}
};


class B : std::enable_shared_from_this<B> {
std::shared_ptr<A> r;
foo() {
r = std::make_shared<A>(shared_from_this());
}
};

在B的销毁过程中,~A()被调用;但它想回调被破坏的对象。忽略围绕此的设计问题,行为是定义的,还是依赖于编译器?

最佳答案

表达式 r.lock() 将失败(即返回一个空的 shared_ptr)。

weak_ptr 有效,但 shared_ptr 已经在破坏 B。

事件的顺序是:

shared_ptr<B>::~shared_ptr()
<strong reference count reduced to 0, destruction process begins>
<shared_ptr<B> is now empty>
~B()
shared_ptr<A>::~shared_ptr()
~A()
weak_ptr<B>::lock -> returns shared_ptr<B>(nullptr)

这里有一种次优设计的强烈味道。正式写出需求可能是个好主意。

关于c++ - 指向对象 X 的 weak_ptr 在对象 X 销毁期间是否仍然有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46113509/

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