c++智能指针的循环引用

#include <iostream>
#include <memory>
using namespace std;

class B;
class A
{
public:// 为了省去一些步骤这里 数据成员也声明为public
   //  weak_ptr<B> pb;
    shared_ptr<B> pb;
    A()
    {
        cout << "A struction" << endl;
    }
    void doSomthing()
    {
        /*if (pb.lock())
        {

        }*/
    }

    ~A()
    {
        cout << "kill A\n";
    }
};

class B
{
public:
   // weak_ptr<A> pa;
   shared_ptr<A> pa;
    B()
    {
        cout << "B struction" << endl;
    }
   
    ~B()
    {
        cout << "kill B\n";
    }
};

int main(int argc, char **argv)
{
    shared_ptr<A> sa(new A());
    shared_ptr<B> sb(new B());
    if (sa && sb)
    { 
        sa->pb = sb;
        sb->pa = sa;
    }
    //对于指针来说,当new时会调用构造函数,当delete时会调用析构函数,若程序运行后时,没有调运析构函数,说明没有delete,可以以此验证变量所指内存是否销毁,比如要想sa指向的内存是否释放,必须在sa出作用域后,看sa的析构函数是否被调用.
    //弱引用存在的意义是打破循环引用,弱引用不会增加计数,但是会指向存在的内存;
    //当A要释放时,若B为强引用,则必须先释放B,若B为弱引用,A跳过B直接释放;
    //同时为强引用,sa.use_count() == 2, sb.use_count() == 2;只会调用构造函数,不会调用析构函数
    //同时为弱引用。能正常释放,sa.use_count() == 1, sb.use_count() == 1;
    //B中a为弱引用,先释放A,在释放B,由于a为弱引用,a的计数会少一个
    //A中B为弱引用,先释放B,在释放A,由于b存在一个弱引用,故b计数会少一个
    cout << "sb use count:" << sb.use_count() << endl;
    cout << "sa use count:" << sa.use_count() << endl;
    
    return 0;
}
Q:use_count()指什么
A:指的是有多少个指针变量指向该指针指向的该块内存,例如sa.use_count()表示指向new A()的指针数量

Q:当使用弱指针时,会有一个内存的计数为2,他会正常释放吗?为什么

1.不使用使用释放前,

2.释放后,都会要求对方先释放

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值