shared_ptr

来源:互联网 发布:三星pc软件手机版本 编辑:程序博客网 时间:2024/04/30 12:48

shared_ptr

头文件: "boost/shared_ptr.hpp"

几乎所有稍微复杂点的程序都需要某种形式的引用计数智能指针。这些智能指针让我们不再需要为了控制被两个或多个对象共享的对象的生存期而编写复杂的逻辑。当引用计费降为零,没有对象再需要这个共享的对象,这个对象就自动被销毁了。引用计数智能指针可以分为插入式(intrusive)和非插入式(non-intrusive)两类。前者要求它所管理的类提供明确的函数或数据成员用于管理引用计数。这意味着在类的设计时就必须预见到它将与一个插入式的引用计数智能指针一起工作,或者重新设计它。非插入式的引用计数智能指针对它所管理的类没有任何要求。引用计数智能指针拥有与它所存指针有关的内存的所有权。没有智能指针的帮助,对象的共享会存在问题,必须有人负负责删除共享的内存。谁负责?什么时候删除?没有智能指针,你必须在管理的内存之外增加生存期的管理,这意味着在各个拥有者之间存在更强的依赖关系。换言之,没有了重用性并增加了复杂性。


shared_ptr 可以从一个裸指针、另一个shared_ptr、一个std::auto_ptr、或者一个boost::weak_ptr构造。还可以传递第二个参数给shared_ptr的构造函数,它被称为删除器(deleter)。删除器稍后会被调用,来处理共享资源的释放。这对于管理那些不是用new分配也不是用delete释放的资源时非常有用(稍后将看到创建客户化删除器的例子)。shared_ptr被创建后,它就可象普通指针一样使用了,除了一点,它不能被显式地删除。


用法

使用shared_ptr解决的主要问题是知道删除一个被多个客户共享的资源的正确时机。下面是一个简单易懂的例子,有两个类 A 和 B, 它们共享一个int实例。使用boost::shared_ptr, 你需要必须包含 "boost/shared_ptr.hpp".

#include "boost/shared_ptr.hpp"#include <cassert>class A {  boost::shared_ptr<int> no_;public:  A(boost::shared_ptr<int> no) : no_(no) {}  void value(int i) {    *no_=i;  }};class B {  boost::shared_ptr<int> no_;public:  B(boost::shared_ptr<int> no) : no_(no) {}  int value() const {    return *no_;  }};int main() {    boost::shared_ptr<int> temp(new int(14));    A a(temp);    B b(temp);    a.value(28);    assert(b.value()==28);}


shared_array

头文件: "boost/shared_array.hpp"

shared_array 用于共享数组所有权的智能指针。它与shared_ptr的关系就如scoped_arrayscoped_ptr的关系。shared_array 与 shared_ptr 的不同之处主要在于它是用于数组的而不是用于单个对象的。在我们讨论 scoped_array时,我提到过通常std::vector是一个更好的选择。但 shared_array 比 vector更有价值,因为它提供了对数组所有权的共享。shared_array 的接口与 shared_ptr非常相似,差别仅在于增加了一个下标操作符,以及不支持定制删除器。















0 0