智能指针

智能指针

1.什么是智能指针?

​ 智能指针是对裸指针的封装,初衷是让程序员无需手动释放内存,避免内存泄漏。常见的智能指针有auto_ptr(被淘汰)

,unique_ptr,shared_ptr,weak_ptr.。

2.几种智能指针的优缺点

​ 1.weak_ptr:weak_ptr本身不具备资源管理的能力,它存在的目的是解决shared_ptr产生的循环引用问题。weak_ptr指向的对象的引用计数不会增加。

​ 2.unique_ptr:unique_ptr最大的特点是,它对资源是独占的,它不可以复制。它通过在析构函数中释放资源来管理对象的生命周期。可以防止多个指针指向同一个对象,它比shared_ptr更加高效。

​ 3.shared_ptr:shared_ptr最大的特点是可以共享资源。当一个资源需要在多个对象间共享时,就需要shared_ptr了。他通过引用计数来管理资源。当引用计数为0时,资源被释放。shared_ptr可能会导致循环引用问题。

3.shared_ptr自动管理内存的原理

​ shared_ptr内部维护了一个计数器,来跟踪有多少shared_ptr指向同一个资源,当计数器为0的时候,调用delete或自定义的delete来释放资源。

​ 引用计数器何时增加:1.新建一个shared_ptr并指向一个资源; 2.复制构造函数创建一个shared_ptr; 3.用复制运算符(=)给把一个shared_ptr给另一个shared_ptr时

​ 引用计数器何时减少:1.shared_ptr被销毁时,如离开局部作用域或析构函数析构类对象时;2.shared_ptr不再指向一个资源时,如调用reset函数或让它指向另一个资源时

4.循环引用的发生和解决

​ 两个或多个对象相互引用,或复杂数据结构,如图、双向链表等,存在多个引用路径的情况下,可能会存在循环引用问题,导致资源无法释放。这是就需要用weak_ptr来解除循环引用,因为weak_ptr指向的对象的引用计数不会增加。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <memory>
class myclass
{
public:
std::shared_ptr<myclass> other;
myclass(){}
~myclass(){}
};
int main(int argc, char** argv)
{
std::shared_ptr<myclass> ptr1(new myclass());
std::shared_ptr<myclass> ptr2(new myclass());
//这里在myclass内部,ptr1和ptr2相互引用,导致ptr1和ptr2的引用计数均为2,资源无法释放。
ptr1->other = ptr2;
ptr2->other = ptr1;
return 0;
}