C++ 智能指针三

/* 智能指针shared_ptr注意点 */

#include <iostream>
#include <string>
#include <memory>           //智能指针头文件
class CB;
class CA;

class CA
{
public:
    CA() {}
    ~CA() 
    { 
        printf("hello world A .\n");
    }

    void Register(const std::shared_ptr<CB>& sp)
    {
        m_sp = sp;
    }

private:
    std::shared_ptr<CB> m_sp;
};

class CB
{
public:
    CB() {};
    ~CB() 
    {
        printf("hello world B .\n");
    }

    void Register(const std::shared_ptr<CA>& sp)
    {
        m_sp = sp;
    }

private:
    std::shared_ptr<CA> m_sp;
};

void test()
{
    std::shared_ptr<CA> spa(new CA);          //CA引用计算器为1
    std::shared_ptr<CB> spb(new CB);          //CB引用计算器为1

    spb->Register(spa);  //CA引用计算器为2
    spa->Register(spb);  //CB引用计算器为2

    printf("%d\n", spb.use_count()); // 2
    printf("%d\n", spa.use_count()); // 2

    //函数执行完毕,
    /*
    函数执行完毕,根据先构造的后释放,后构造的先释放可知,先释放的是spb,但是spb在spa中还有一份,
    所以spb引用计数器减一,并且释放spb栈变量(这里强调spb是一个实例对象,spa中的成员属性m_sp也是一个实体对象
    ,spb内部指针指向一个堆变量CB,因为计数器不为0,所以堆变量CB是不会释放的,即spb中的成员属性m_sp也不会被释放),
    释放spa也是一样的(即spa中的成员属性m_sp也没有释放),这样两个实例对象的成员属性m_sp都没有被释放,导致谁都释放不了
    最终结果出现内存泄漏
    可以使用weak_ptr来解决这个问题
    */
}

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

 

转载于:https://www.cnblogs.com/zhanggaofeng/p/10294491.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值