C++中有auto_ptr,unique_ptr,shared_ptr,weak_ptr四种智能指针。
智能指针的主要作用是管理堆内存。因为在C++中,堆内存由程序员手动释放,那有时候可能会出现程序员忘记释放的这一种情况,智能指针就是为了防止这种情况出现的,它的作用是自动化的管理我们的堆内存。
1.auto_ptr
auto_ptr是在C++98中引进的一个概念,那它在C++11中是已经被废弃了。
原因是使用auto_ptr可能会造成和我们的浅拷贝相似的问题:同一块内存的重复释放,导致程序崩溃。
2.unique_ptr
unique_ptr的核心思想是:它持有一个对象的唯一所有权,即不能有两个指针指向同一个对象。
那么这个核心思想如何体现呢?
1.unique_ptr禁止拷贝构造,禁用拷贝构造函数和赋值运算符
2.支持移动语义,可以将唯一对象的所有权转移给另外一个指针
3.shared_ptr
shared_ptr就和它的名字一样,它的核心思想是共享所有权,即多个shared_ptr可以指向同一个对象。
它的内部维护了一个引用计数器,每当我们将一个shared_ptr指向同一个对象时,引用计数器+1,指针每析构一次,引用计数器-1,当我们的引用计数器归零时,会自动释放所指对象的内存。
shared_ptr不像unique_ptr,它是支持拷贝构造的
shared_ptr是线程安全的吗?
shared_ptr的引用次数加减操作内部自动加锁解锁,是线程安全的。但是指向对象的指针不是线程安全的,所以对象的读取需要加锁
一、使用智能指针访问资源不是线程安全的,需要手动加锁解锁。
二、智能指针的拷贝也不是线程安全的
4.weak_ptr
weak_ptr的作用呢主要是通过和shared_ptr配合,解决shared_ptr中的循环引用的问题。