在C++中shared_ptr
与std::unique_ptr
类似。std::shared_ptr
与std::unique_ptr
的主要区别在于前者是使用了引用计数,可以跟踪引用数目。这意味着,可以有多个std::shared_ptr
实例指向同一块动态分配的内存,当最后一个引用对象离开其作用域时,才会释放这块内存。值得注意的是,std::shared_ptr
不能用于管理C语言风格的动态数组。下面看一使用的例子:
#include <cassert>
#include <iostream>
#include <memory>
class Any {};
int main(void) {
auto p1 = std::make_shared<Any>();
assert(p1.use_count() == 1);
{
auto p2 = p1;
std::shared_ptr<Any> p3;
p3 = p1;
assert(p1.use_count() == 3);
assert(p2.use_count() == 3);
assert(p3.use_count() == 3);
}
assert(p1.use_count() == 1);
return 0;
}
shared_ptr
智能指针只能通过赋值
和构造函数
才能增加引用计数。如果同一指针分别赋值给shared_ptr
会造成double free的错误。- 对同一个对象分享所有权的
shared_ptr
在多个线程上的析构不需要外部加锁保护,因为引用计数本身修改是原子操作。