工作原理
1.当shared_ptr 对象与其他shared_ptr 对象关联时,则将与此指针关联的引用计数+1。
2.当任何 shared_ptr 对象超出作用域时,则在其析构函数中,它将关联指针的引用计数减1。如果引用计数变为0,则表示没有其他 shared_ptr 对象与此内存关联,析构函数会使用delete函数删除该内存。
使用的注意事项:
运算符:
与普通指针相比,shared_ptr仅提供-> 、*和==运算符,没有+、-、++、--、[]等运算符。
初始化:
- 构造函数初始化:
int *pNum = new int(23);
std::shared_ptr
- 拷贝构造函数初始化:
std::shared_ptr
- 不允许同一个指针初始化多个智能指针对象:
std::shared_ptr
原因-当p1超出作用域时会调用delete释放pNum所指的内存,此时pNum成了悬空指针, 当p3超出作用域再次delete的时候就可能会出错。
- 不允许用栈中指针构造 shared_ptr对象:
shared_ptr 默认析构函数使用delete来删除关联指针,所以构造必须使用new的堆空间指针,否则会报错。
- make_shared()<>初始化:
std::shared_ptr
但是用这种方式初始化,没有办法定义删除器,用shared_ptr管理动态数组时,需要指定删除器,因为shared_ptr的默认删除器不支持数组对象。
std::shared_ptrp1(new int[10], [](int *p){ delete [] p;});
参考:智能指针的用法shared_ptr_方池安夏的博客-CSDN博客_智能指针shared_ptr
C++智能指针详解:shared_ptr_吃素的施子的博客-CSDN博客_c++ shared_ptr



