C++智能指针weak_ptr的学习笔记

  1. weak_ptr 智能指针是为了解决shared_ptr相互引用导致的死锁问题,它不控制对象的生命周期,不会增加对象的引用次数,和shared_ptr可以相互转化,是一种弱应用。
    下面的代码就陷入了死锁,p1和p2相互引用导致计数一直为1,而对象得不到销毁。
#include<iostream>
#include<memory>
using namespace std;
class Dog{

    public:
        Dog(){
            cout<<"Nameless dog created."<<endl;
            s1="nameless";

        }
        Dog(string name){
            cout<<"Dog is created:" << name<<endl;
            s1=name;

        }
        void makefriend(shared_ptr<Dog> f)
        {
            ptr_friend=f;
        }
        void foo(){

            cout<<"Dog "<<s1<<" rules. "<<endl;

        }
        ~Dog(){
            cout<<"Dog is destoryed:"<<s1<<endl;
        }
    private:
        shared_ptr<Dog> ptr_friend;
        string s1;

};
void test()
{
    shared_ptr<Dog> p1=make_shared<Dog>("dog1");
    shared_ptr<Dog> p2=make_shared<Dog>("dog2");
    p1->makefriend(p2);
    p2->makefriend(p1);

}
int main()
{
    test();
    return 0;
}

在这里插入图片描述
借助weak_ptr指针代码

#include<iostream>
#include<memory>
using namespace std;
class Dog{

    public:
        Dog(){
            cout<<"Nameless dog created."<<endl;
            s1="nameless";

        }
        Dog(string name){
            cout<<"Dog is created:" << name<<endl;
            s1=name;

        }
        void makefriend(shared_ptr<Dog> f)
        {
            ptr_friend=f;
        }
        void foo(){

            cout<<"Dog "<<s1<<" rules. "<<endl;

        }
        ~Dog(){
            cout<<"Dog is destoryed:"<<s1<<endl;
        }
    private:
        weak_ptr<Dog> ptr_friend;//此处设置为weak_ptr
        string s1;

};
void test()
{
    shared_ptr<Dog> p1=make_shared<Dog>("dog1");
    shared_ptr<Dog> p2=make_shared<Dog>("dog2");
    p1->makefriend(p2);
    p2->makefriend(p1);

}
int main()
{
    test();
    return 0;
}

在这里插入图片描述
对象成功销毁。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值