gpt4 book ai didi

c++ - 如何使用weak_ptr打破shared_ptr循环引用

转载 作者:IT老高 更新时间:2023-10-28 22:32:53 29 4
gpt4 key购买 nike

我读过weak_pointers 可以用来打破循环引用。

考虑下面的循环引用示例

struct A
{
boost::shared_ptr<A> shrd_ptr;
};


boost::shared_ptr<A> ptr_A(boost::make_shared<A>());
boost::shared_ptr<A> ptr_b(boost::make_shared<A>());
ptr_A->shrd_ptr = ptr_b;
ptr_b->shrd_ptr = ptr_A;

以上是循环引用的例子,我想知道如何破解上面使用 weak_ptr 的循环引用?

更新:根据收到的建议,我提出了以下建议:

struct A
{
boost::weak_ptr<A> wk_ptr;
};

boost::shared_ptr<A> ptr_A (boost::make_shared<A>());
boost::shared_ptr<A> ptr_B (boost::make_shared<A>());
ptr_A->wk_ptr = ptr_B;
ptr_B->wk_ptr = ptr_A;

这会是正确的方法吗?

最佳答案

循环引用的经典例子是你有两个类 AB在哪里 A引用 B其中引用了 A :

#include <memory>
#include <iostream>

struct B;
struct A {
std::shared_ptr<B> b;
~A() { std::cout << "~A()\n"; }
};

struct B {
std::shared_ptr<A> a;
~B() { std::cout << "~B()\n"; }
};

void useAnB() {
auto a = std::make_shared<A>();
auto b = std::make_shared<B>();
a->b = b;
b->a = a;
}

int main() {
useAnB();
std::cout << "Finished using A and B\n";
}

如果两个引用都是 shared_ptr然后说A拥有 B 的所有权和 B拥有 A 的所有权,这应该敲响警钟。换句话说,A保留B还活着B保留A活着。

在此示例中,实例 ab仅用于 useAnB()函数,所以我们希望它们在函数结束时被销毁,但是正如我们在运行程序时看到的那样,没有调用析构函数。

解决方案是决定谁拥有谁。比方说A拥有 B但是 B不拥有A然后我们替换对 A 的引用在 Bweak_ptr像这样:

struct B {
std::weak_ptr<A> a;
~B() { std::cout << "~B()\n"; }
};

然后,如果我们运行程序,我们会看到 ab像我们预期的那样被销毁。

Live demo

编辑:在您的情况下,您建议的方法看起来非常有效。剥夺 A 的所有权和别的东西拥有A s。

关于c++ - 如何使用weak_ptr打破shared_ptr循环引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27085782/

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