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;
}

 

posted on 2019-01-20 12:31  寒魔影  阅读(140)  评论(0编辑  收藏  举报

导航