我读过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;
这会是正确的方法吗?
最佳答案
循环引用的经典例子是你有两个类 A
和 B
在哪里 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
活着。
在此示例中,实例 a
和 b
仅用于 useAnB()
函数,所以我们希望它们在函数结束时被销毁,但是正如我们在运行程序时看到的那样,没有调用析构函数。
解决方案是决定谁拥有谁。比方说A
拥有 B
但是 B
不拥有A
然后我们替换对 A
的引用在 B
与 weak_ptr
像这样:
struct B {
std::weak_ptr<A> a;
~B() { std::cout << "~B()\n"; }
};
然后,如果我们运行程序,我们会看到 a
和 b
像我们预期的那样被销毁。
编辑:在您的情况下,您建议的方法看起来非常有效。剥夺 A
的所有权和别的东西拥有A
s。
关于c++ - 如何使用weak_ptr打破shared_ptr循环引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27085782/