我有两种类型:A& B. 一个'聪明'点B和B'聪明'点A. 在主范围内,我有一个指向A的智能指针。
class A;
class B;
typedef shared_ptr<A> pA;
typedef shared_ptr<B> pB;
class B {
public:
B() {}
pA a;
virtual ~B() {cout << "delete b" << endl;}
};
class A {
public:
A() : b(new B()) {}
pB b;
virtual ~A() {cout << "delete a" << endl;}
};
int main(int argc, char **argv)
{
{
pA pa(new A());
pa->b->a = pa;
}
cout << "here" << endl;
}
我希望在范围的末尾删除这两个对象。 没有任何对象被删除,因为A有两个指向自身的指针(一个在b中,一个在主勺中)。
这是一个简单的例子。实际上我有两种以上的类型和更多的指针。 可以想象一个大的对象结构指向彼此浮动在RAM中,只有一个指针从主范围指向这个结构。我希望在释放此指针后删除此结构。
答案 0 :(得分:6)
对于可能存在循环依赖但不进行架构重构的地方,最好使用weak_ptr
和shared_ptr
。
struct A {
std::shared_ptr<B> b;
};
struct B {
std::weak_ptr<A> a;
};
答案 1 :(得分:6)
在某处使用weak pointer来打破循环 - 它专为这种情况而设计。
此外,
的循环引用std::weak_ptr
用于打破std::shared_ptr