Raj*_*war 14 c++ smart-pointers c++03
我已经读过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;
Run Code Online (Sandbox Code Playgroud)
现在上面是一个循环引用的例子,我想知道如何通过使用来打破上面的循环引用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;
Run Code Online (Sandbox Code Playgroud)
这是正确的方法吗?
Chr*_*rew 38
循环引用的经典示例是您有两个类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";
}
Run Code Online (Sandbox Code Playgroud)
如果两个引用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"; }
};
Run Code Online (Sandbox Code Playgroud)
然后,如果我们运行该程序,我们会看到a并按b预期销毁.
编辑:在您的情况下,您建议的方法看起来完全有效.取得所有权A并拥有其他东西A.
| 归档时间: |
|
| 查看次数: |
8592 次 |
| 最近记录: |