简介
shared_ptr
是一种通过指针保持对象共享所有权的智能指针。多个 shared_ptr
对象可持有同一对象。下列情况之一出现时销毁对象并解分配其内存
- 最后剩下的持有对象的
shared_ptr
被销毁 - 最后剩下的持有对象的
shared_ptr
被通过operator=
或reset()
赋值为另一指针
成员函数
观察器
1 | T* get(); // 返回引用对象的原始指针 |
swap
交换*this
与r
的存储指针值与所有权。不调整引用计数(若它们存在)
1 | void swap(shared_ptr& r); |
reset
[1]释放被管理对象的所有权
调用后*this
不管理对象。等价于shared_ptr().swap(*this);
(空对象与当前智能指针交换管理权)
1 | void reset(); // 释放该智能指针, 使智能指针的引用数-1, 当引用数为0时delete |
[2]修改当前智能指针指向新的对象,并让原智能指针的计数器-1
等价于shared_ptr<T>(ptr).swap(*this)
,首先构建对象,创建智能指针管理该对象,同时将原先的智能指针-1,如果原先智能指针计数为0,则调用delete
销毁
1 | void reset(T* ptr); |
针对void reset(T* ptr);
的使用案例和错误补充
1 | int main() { |
线程安全
只保证引用计数的内存安全,不保证所指对象的成员或方法线程安全。
- 对
shared_ptr
本身的操作是线程安全的,在修改引用次数的时候是原子操作,多线程中可以安全的复制指针或者销毁指针 - 对
shared_ptr
所指对象的操作不是线程安全的,对对象进行操作需要加锁等安全机制