shared_ptr使用

  • 为了解决C++内存泄漏的问题,C++11引入了智能指针(Smart Pointer)。
  • 原理:接受一个申请好的内存地址,构造一个保存在栈上的智能指针对象,当程序退出栈的作用域范围后,由于栈上的变量自动被销毁,智能指针内部保存的内存也就被释放掉了(除非将智能指针保存起来)。
  • C++11提供了三种智能指针:std::shared_ptr, std::unique_ptr, std::weak_ptr,使用时需添加头文件
  • shared_ptr使用引用计数,每一个shared_ptr的拷贝都指向相同的内存。每使用他一次,内部的引用计数加1,每析构一次,内部的引用计数减1,减为0时,删除所指向的堆内存。shared_ptr内部的引用计数是安全的,但是对象的读取需要加锁。
  • 使用引用计数, 所以有循环计数的问题,如下述代码所示。为了打破循环,可以使用std::weak_ptr. 顾名思义, weak_ptr是一个弱引用, 只引用, 不计数。如果一块内存被shared_ptr和weak_ptr同时引用, 当所有shared_ptr析构了之后,不管还有没有weak_ptr引用该内存, 内存也会被释放。所以weak_ptr不保证它指向的内存一定是有效的,在使用之前需要调用lock()方法检查是否为NULL。
class B;
class A {
public:
    shared_ptr p;
};

class B {
public:
    shared_ptr p;
};

int main() {
    while (true) {
        shared_ptr pa(new A());
        shared_ptr pb(new B());
        pa->p = pb;
        pb->p = pa;
    }
    return 0;
}
在while循环中,先是在栈中构造了两个智能指针,分别管理两块堆内存,记为A, B。
然后两个赋值语句,使得在shared_ptr中,A,B的引用计数均为2,所以在析构掉pa与pb时,
他们的引用计数都没能到达0,于是发生了循环引用,于是开始内存泄露

你可能感兴趣的:(C++)