智能指针的学习——CPP

智能指针

之前的文章有说过:在C++里,动态内存的分配是通过一对运算符——new和delete完成的。但这样往往会造成内存泄漏或者是在还是指针指向内存的时候释放了内存。

因此标准库提供了两种智能指针来管理对象——shared_ptr(允许多个指针指向同一个内存)、unique_ptr(指针独占对象),另外标准库还提供了一个weak_ptr的伴随类,指向shared_ptr管理的对象。

shared_ptr

shared_ptr的目标是:在指向的对象不再被使用的时候,即自动释放相关对象的内存。

计数器

智能指针内部有一个计数器,无论何时我们拷贝一个shared_ptr,计数器都会递增,它的作用就是记录着当前有多少个指针在引用着这个对象。

当计数器为0时,智能指针会自动释放其管理的资源。

当用一个shared_ptr去初始化另一个shared_ptr,作为参数传递进函数,以及作为函数返回值,引用计数都会递增;

当给一个shared_ptr赋予新值,或者shared_ptr被销毁,如离开作用域,则引用计数递减。

销毁对象

当指向一个对象的shared_ptr被销毁时,shared_ptr类会自动递减所指向对象的引用计数,并检查是否为0,如果为0则去释放内存。

weak_ptr

weak_ptr与shared_ptr最大的不同是weak_ptr在指向同一个对象时不能递增引用计数。

它不可以控制所指向对象的生存周期,因为它指向的是一个由shared_ptr管理的对象。

  • 作用:防止shared_ptr的循环引用;
    • B持有指向A内成员的一个shared_ptr,A也持有指向B内成员的一个shared_ptr,此时A和B的生命周期互相由对方决定,事实上都无法从内存中销毁。
  • 作用获得this指针的shared_ptr,使得对象自身能够生产shared_ptr来管理自己;