shared_ptr是一个最像指针的"智能指针",是
boost.smart_ptr库中最有价值、最重要的组成部分,也是最有用的,Boost库的许多组件--甚至还包括其他一些领域的智能指针都使用了
shared_ptr。抱歉,我实在想不出什么更恰当的词汇来形容它在软件开发中的重要性。再强调一遍,shared_ptr非常有价值、非常重要、非常
有用。
shared_ptr与scoped_ptr一样包装了new操作符在堆上分配的动态对象,但它实现的是引用计数型的智能指针
,可以被自由地拷贝和赋值,在任意的地方共享它,当没有代码使用(引用计数为0)它时才删除被包装的动态分配的对象。shared_ptr也可以安全地放到标准容器中,并弥补了auto_ptr因为转移语义而不能把指针作为STL容器元素的缺陷。
在C++历史上曾经出现过无数的引用计数型智能指针实现,但没有一个比得上boost::shared_ptr,在过去、现在和将来,它都是最好的。
1. shared_ptr的线程安全性
shared_ptr 本身不是 100% 线程安全的。它的引用计数本身是安全且无锁的,但对象的读写则不是,因为 shared_ptr
有两个数据成员,读写操作不能原子化。根据文档,shared_ptr
的线程安全级别和内建类型、标准库容器、string 一样,即:
- 一个 shared_ptr 实体可被多个线程同时读取;
- 两个的 shared_ptr 实体可以被两个线程同时写入,“析构”算写操作;
- 如果要从多个线程读写同一个 shared_ptr 对象,那么需要加锁。
2. shared_ptr用法
shared_ptr sp(new
int(10));
//一个指向整数的shared_ptr
assert(sp.unique());
//现在shared_ptr是指针的唯一持有者
shared_ptr sp2 =
sp;
//第二个shared_ptr,拷贝构造函数
assert(sp == sp2 && sp.use_count()
== 2);
//两个shared_ptr相等,指向同一个对象,引用计数为2
*sp2 = 100;
//使用解引用操作符修改被指对象
assert(*sp ==
100);
//另一个shared_ptr也同时被修改
sp.reset();
//停止shared_ptr的使用
assert(!sp);
//sp不再持有任何指针(空指针)
示例二:
class
shared
//一个拥有shared_ptr的类
{
private:
shared_ptr
p;
//shared_ptr成员变量
public:
shared(shared_ptr
p_):p(p_){}
//构造函数初始化shared_ptr
void
print()
//输出shared_ptr的引用计数和指向的值
{
cout << "count:"
<<
p.use_count()
<< "v ="
<<*p <<
endl;
}
};
void print_func(shared_ptr
p)
//使用shared_ptr作为函数参数
{
//同样输出shared_ptr的引用计数和指向的值
cout
<< "count:"
<<
p.use_count()
<< " v="
<<*p <<
endl; }
int main()
{
shared_ptr
p(new
int(100));