目录
所谓的智能指针,其实是一个类,类的对象在离开作用域时会自动调用析构函数,利用这一特性达到自动释放内存,避免内存泄漏。
目前C++共有四类智能指针,这些智能指针大多会重载以下函数(除了weak_ptr):
T* get();
T& operator*();
T* operator->();
T& operator=(const T& val);
T* release();
void reset (T* ptr = nullptr)
1、auto_ptr
C++98标准中包含,但C++11标准中已经废弃,它是独占类型的指针,但是当我们尝试将两个智能指针指向同一个对象时,编译却不会报错,但运行很可能崩溃。
2、unique_ptr
C++11引入,也是独占式的指针,当尝试将两个unique_ptr指向同一个对象时会报错,可以保证同一时间只有一个unique_ptr指向该对象。
对于以上这两种独占式的智能指针,release操作都是会将内部的指针设置为NULL,但不会释放指向的对象的内存,返回的指针置空之前的值;
reset操作会释放当前指针指向对象的内存,如果ptr不为空,又会将内部指针初始化为ptr的值,否则内存指针会置空。
3、shared_ptr
C++11引入,是共享式的指针,为了确保所指向的内存最终被释放,所以引入了引用计数机制,当shared_ptr所指向的对象的引用计数为0时,会释放所指向的内存。使用use_count函数可以获取指针指向对象的引用计数个数。
对于shared_ptr,它的release操作会将所指对象的引用计数的个数减一,如果减完引用计数为0,就会释放指向的内存。
它的reset操作会将引用计数减一,如果引用计数为0,就会释放当前所指向的内存,如果传入的ptr不为空,会将内存指针再指向新对象,同时引用计数加一。
4、weak_ptr
C++11引入,之所以引入它,是为了解决shared_ptr的循环引用问题,也正因如此,weak_ptr是辅助shared_ptr的,它指向的是由shared_ptr指向并管理的对象,它不会增加对象的引用计数,所以也不会释放所指向的内存。
weak_ptr并没有重载*、->操作符,也没有重载release函数,它的reset函数,只会把自身指针置空。
它还实现了lock函数,该函数会返回一个跟当前的weak_ptr指向同一块内存的shared_ptr。