gpt4 book ai didi

c++ - 将weak_ptr与循环引用一起使用

转载 作者:行者123 更新时间:2023-12-01 14:42:48 25 4
gpt4 key购买 nike

因此,我很难理解为什么我们必须使用weak_ptr,尤其是对于循环引用问题,请考虑以下代码:

class B; //forward declaration

class A {
shared_ptr<B> b_ptr;
public:
void set_B(shared_ptr<B>& b)
{
b_ptr = b;
}
A() { cout << "A constructor" << endl; }
~A() { cout << "A destructor" << endl; }
};

class B {
shared_ptr<A> a_ptr;
public:
void set_A(shared_ptr<A>& a)
{
a_ptr = a;
}
B() { cout << "B constructor" << endl; }
~B() { cout << "B destructor" << endl; }
};

int main() {
shared_ptr<A> a = make_shared<A>();
shared_ptr<B> b = make_shared<B>();
a->set_B(b);
b->set_A(a);
}

现在,据我所知,当 ab都超出范围并且它们的引用计数为0时,它们将尝试重新分配并销毁指向内存的指针,但是在这种情况下,由于两个指向对象的对象都具有 shared_ptr',因此它们无法执行此操作引用计数为1使其无法删除的s,现在是真的吗?

然后,它说要解决此问题,我必须将 shared_ptr中的 class B设置为 weak_ptr,现在为什么呢?它的引用计数仍然为1,不是吗?即使使用了weak_ptr,仍然保留了 shared_ptr<B> b_ptr;,其引用计数为1,那么如何删除它呢?

还提到了 weak_ptr破坏了强所有权引用,但是weak_ptr如何没有所有权,它将如何访问该对象?

提前致谢。

最佳答案

使用所有std::shared_ptr,您将拥有:

int main() {
std::shared_ptr<A> a = std::make_shared<A>(); // ref_count_a = 1
std::shared_ptr<B> b = std::make_shared<B>(); // ref_count_b = 1
a->set_B(b); // ref_count_b = 2
b->set_A(a); // ref_count_a = 2
} // ref_count_a = 1 && ref_count_b = 1
// memleak due to the cycle


class B {
std::weak_ptr<A> a_ptr;
// ...
};

它成为了:
int main() {
std::shared_ptr<A> a = std::make_shared<A>(); // ref_count_a = 1
std::shared_ptr<B> b = std::make_shared<B>(); // ref_count_b = 1
a->set_B(b); // ref_count_b = 2
b->set_A(a); // ref_count_a = 1 , weak_ref_a = 1
} // ref_count_a = 0 && ref_count_b = 1
// -> release a -> ref_count_b = 0
// -> release b (+ control block) -> weak_ref_a = 0
// -> release control block of a

Also it mentions that a weak_ptr breaks strong ownership reference but how can a weak_ptr have no ownership, how will it access the object?



该控件为 shared_ptr维护一个计数器(以释放对象)
以及 weak_ptr的计数器以释放控制块。
由于控制块,weak_ptr检索了shared_ptr。

Finally I heard that a weak_ptr is a smart pointer which can use methods such as lock() or expired() to manage a shared_ptr, again is this correct?



关于c++ - 将weak_ptr与循环引用一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62048085/

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