shared_ptr

转载 2011年02月09日 16:22:00

 

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用法

 

示例一:

 

示例二:

3. 应用于标准容器

有两种方式可以将shared_ptr应用于标准容器(或者容器适配器等其他容器)。

一种用法是将容器作为shared_ptr管理的对象,如shared_ptr<list<T> >,使容器可以被安全地共享,用法与普通shared_ptr没有区别,我们不再讨论。

另一种用法是将shared_ptr作为容器的元素,如vector<shared_ptr<T> >,因为shared_ptr支持拷贝语义和比较操作,符合标准容器对元素的要求,所以可以实现在容器中安全地容纳元素的指针而不是拷贝。

标准容器不能容纳auto_ptr,这是C++标准特别规定的(读者永远也不要有这种想法)。标准容器也不能容纳scoped_ptr,因为scoped_ptr不能拷贝和赋值。标准容器可以容纳原始指针,但这就丧失了容器的许多好处,因为标准容器无法自动管理类型为指针的元素,必须编写额外的大量代码来保证指针最终被正确删除,这通常很麻烦很难实现。

存储shared_ptr的容器与存储原始指针的容器功能几乎一样,但shared_ptr为程序员做了指针的管理工作,可以任意使用shared_ptr而不用担心资源泄漏。

 

 

下面的代码示范了将shared_ptr应用于标准容器的用法:

 

 

这段代码需要注意的是迭代器和operator[]的用法,因为容器内存储的是shared_ptr,我们必须对迭代器pos使用一次解引用操作符*以获得shared_ptr,然后再对shared_ptr使用解引用操作符*才能操作真正的值。*(*pos)也可以直接写成**pos,但前者更清晰,后者很容易让人迷惑。vector的operator[]用法与迭代器类似,也需要使用*获取真正的值。

 

C++之shared_ptr总结

C++关于shared_ptr的总结。里面有一份简单的源码实现,有助于理解shared_ptr的实际原理。希望对大家有帮助。也欢迎批评指正。...
  • u013696062
  • u013696062
  • 2014年09月29日 09:16
  • 24389

【C++11新特性】 C++11智能指针之shared_ptr

C++中的智能指针首先出现在“准”标准库boost中。随着使用的人越来越多,为了让开发人员更方便、更安全的使用动态内存,C++11也引入了智能指针来管理动态对象。在新标准中,主要提供了shared_p...
  • Xiejingfa
  • Xiejingfa
  • 2016年02月26日 15:21
  • 13552

shared_ptr的一些尴尬

shared_ptr在boost库中已经有多年了,C++11又为其正名,把他引入了STL库,放到了std的下面,可见其颇有用武之地;但是shared_ptr是万能的吗?有没有什么样的问题呢?本文并不说...
  • henan_lujun
  • henan_lujun
  • 2013年05月28日 14:32
  • 19146

智能指针 shared_ptr 的使用方法

基于Boost库, C++11 加入了shared_ptr和weak_ptr. 它们最早在TR1中就被引入, 但在C++11中, 在Boost的基础上又加入了新的功能. std::shared_ptr...
  • yusiguyuan
  • yusiguyuan
  • 2014年03月25日 09:29
  • 6718

智能指针(二):shared_ptr实现原理

前面讲到auto_ptr有个很大的缺陷就是所有权的转移,就是一个对象的内存块只能被一个智能指针对象所拥有.但我们有些时候希望共用那个内存块.于是C++ 11标准中有了shared_ptr这样的智能指针...
  • weiwenhp
  • weiwenhp
  • 2013年03月22日 20:57
  • 14068

shared_ptr:弱回调技术

shared_ptr:弱回调技术 分类: Linux多线程编程2013-10-24 23:34 287人阅读 评论(0) 收藏 举报 shared_ptr弱回调技术   ...
  • pi9nc
  • pi9nc
  • 2014年02月17日 09:35
  • 1612

shared_ptr的理解和注意事项

昨天把shared_ptr的源码分析了一遍,也看了一些有关shared_ptr分析的文章,今天自己来总结一下。  以独立语句将newed对象置入智能指针对于下面这样一个使用智能指针的函数调用,可能会...
  • FreeeLinux
  • FreeeLinux
  • 2017年01月22日 17:35
  • 1436

shared_ptr简介以及常见问题

本文中的shared_ptr以vs2010中的std::tr1::shared_ptr作为研究对象。可能和boost中的有些许差异,特此说明。 基本功能 shared_ptr提供了...
  • leiych
  • leiych
  • 2014年02月26日 18:22
  • 1500

boost::shared_ptr:传值还是传引用?

关于shared_ptr shared_ptr,顾名思义,是共享指针。boost库引入shared_ptr为了实现在C++中通过引用计数对堆对象进行内存管理的一种机制。更多关于shared_pt...
  • muyuxuebao
  • muyuxuebao
  • 2016年04月26日 19:21
  • 2474

浅谈智能指针auto_ptr/shared_ptr/unique_ptr

一.智能指针1.引入我们通常使用类似new申请一块空间,交由一个指针指向,假如说最后忘记delete,将会造成内存泄露。而智能指针的出现,就是对这种问题的解决方式,智能指针类似指针,却可以用于管理动态...
  • derkampf
  • derkampf
  • 2017年05月23日 19:24
  • 538
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:shared_ptr
举报原因:
原因补充:

(最多只允许输入30个字)