智能指针的引入为c++降低了显式内存管理的风险。智能指针管理一个指针,避免因为忘记释放申请的内存而导致内存泄漏。
一、unique_ptr
由名字可以看出是有独占语义的智能指针,使用该指针管理的资源不可以再被其他智能指针所管理。实现该语义的方式是unique_ptr的拷贝构造函数和拷贝赋值运算符被禁用,但是支持转移语义。C++11中没有实现make_unique辅助函数,需要的话可以自己实现。
二、shared_ptr
共享型智能指针,可以多个智能指针管理一个资源,智能指针中的引用计数表示有多少个shared_ptr共同管理一个资源,当最后一个shared_ptr析构的时候释放掉资源。
可以通过构造函数传入一个原生指针来初始化一个智能指针,但是要注意不要使用相同的原生指针构造出不同的智能指针,这样会引起重复释放。推荐使用make_shared辅助函数,相比于使用原生指针初始化智能指针,该辅助函数可以一次性的申请需要用到的堆空间(需要管理的内存和辅助管理的内存(强引用计数、弱引用计数等等))。
另外智能指针还可以指定删除器,当管理一个数组的时候,一定要显式的指定删除器将释放操作改为delete[]。
weak_ptr
一般配合shared_ptr使用,来解决循环引用的问题。他指向一个shared_ptr管理的资源,它的构造和析构都不会影响管理资源的shared_ptr的强引用计数,它存在的主要目的是为了监视shared_ptr管理的资源的生命周期。在必要的使用使用lock方法可以升级为一个shared_ptr。