• C++ 智能指针三


    /* 智能指针shared_ptr注意点 */
    
    #include <iostream>
    #include <string>
    #include <memory>           //智能指针头文件
    class CB;
    class CA;
    
    class CA
    {
    public:
        CA() {}
        ~CA() 
        { 
            printf("hello world A .
    ");
        }
    
        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 .
    ");
        }
    
        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
    ", spb.use_count()); // 2
        printf("%d
    ", 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;
    }
  • 相关阅读:
    cocos2d-x 纹理研究
    cocos2d-x 获取图片的某像素点的RGBA颜色
    cocos2d-x Menu、MenuItem
    cocos2d-x ScrollView、TableView
    cocos2d-x RenderTexture
    cocos2d-x NotificationCenter
    cocos2d-x ClippingNode
    cocos2d-x Animation
    JDK,JRE,JVM区别与联系(ZZ)
    SQL中join的用法
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/10294491.html
Copyright © 2020-2023  润新知