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