零、前言
这篇文章本是作为:C++ 智能指针类的第二部分,但无奈那篇篇幅已经不能再长了,于是只好将其单独写成一篇,且把 shared_ptr 的循环引用放在这里写,这样稍微比较连贯一些。
一、shared_ptr 的循环引用
定义:所谓循环引用,可类比于这样的一棵树,它含有父亲结点指向孩子结点的指针,也有孩子结点指向父亲结点的指针,即父亲结点与孩子结点互相引用。
可先看一个例子(改编自:智能指针的死穴---循环引用):
#include <iostream>
#include <memory>
using namespace std;
class B;
class A
{
public:
A(){cout<<"A constructor"<<endl;}
~A(){cout<<"A destructor"<<endl;}
shared_ptr<B> m_b;
};
class B
{
public:
shared_ptr<A> m_a;
B(){cout<<"B constructor"<<endl;}
~B(){cout<<"B destructor"<<endl;}
};
int main()
{
cout<<"shared_ptr cycle reference:\n";
shared_ptr<A> a(new A);
shared_ptr<B> b(new B);
a->m_b = b; //cycle reference
b->m_a = a;
return 0;
}
输出:
由输出结果可以看出:A 和 B 的析构函数都是没有执行的,内存泄露!
分析:众所周知,new 出来的对象,必须由程序员自己 delete 掉,在此运用了智能指针:shared_ptr来指向 ne