本文共 1363 字,大约阅读时间需要 4 分钟。
auto_ptr由于它的破坏性复制语义,无法满足标准容器对元素的要求,因而不能放在标准容器中;如果我们希望当容器析构时能自动把它容纳的指针元素所指的对象删除时,通常采用一些间接的方式来实现,显得比较繁琐。boost库中提供了一种新型的智能指针shared_ptr,它解决了在多个指针间共享对象所有权的问题,同时也满足容器对元素的要求,因而可以安全地放入容器中。
当出现以下情况时应该优先考虑使用shared_ptr: 1.有多个使用者共同使用同一个对象,而没有一个明显的拥有者。 2.一个对象的复制操作很昂贵。 3.要把指针存入标准库容器。 4.要传送对象到库或从库获取对象,而这些对象没有明确的所有权。 5.当管理需要特殊清除方式的资源时,这时可以通过定制shared_ptr的删除器 来实现。
template<class Other> explicit shared_ptr(Other *ptr); 这个构造函数获得给定指针ptr的所有权。构造后引用计数设为1,构造完成后将获得一个跟ptr指向相同对象的shared_ptr。
template <class Y,class D> shared_ptr(Y* p,D d);
这个构造函数带有两个参数。第一个是shared_ptr将要获得所有权的那个资源,第二个是shared_ptr被销毁时负责释放资源的一个对象,被保存的资源将以d(p)的形式传给那个对象。因此p的值是否有效取决于d。如果引用计数器不能分配成功,shared_ptr抛出一个类型为std::bad_alloc的异常。
shared_ptr(const shared_ptr& sp); 这个复制构造函数可以方便使用一个shared_ptr构造另外一个shared_ptr,原有shared_ptr中保存的资源将被新构造的shared_ptr所共享,引用计数加1.
shared_ptr& operator=(const shared_ptr& r);
赋值操作共享r中的资源,并停止对原有资源的共享。赋值操作不会抛出异常。
void reset();
reset函数用于停止对保存指针的所有权的共享。共享资源的引用计数减一。
T* get() const;
get函数是当保存的指针有可能为空时(这时 operator* 和 operator-> 都会导致未定义行为)获取它的最好办法。注意,你也可以使用隐式布尔类型转换来测试 shared_ptr 是否包含有效指针。这个函数不会抛出异常。
shared_ptr带来的两个问题: 1.体积问题 因为shared_ptr需要进行引用计数,所以它需要额外的内存空间来保存当前内存资源的引用数,这使得一个shared_ptr指针将占用40个字节的内存空间,是一个普通指针所占用内存空间的整整10倍。 2.性能问题 一方面,因为引用技术,shared_ptr需要在运行时对引用计数进行管理和维护,这样就必然需要消耗额外的计算资源,影响程序的性能。另一方面,shared_ptr使用了大量的虚函数,虚函数的使用也带来了一定的性能损失。
shared_ptr所管理的资源的清理工作都是由删除器(deleter)来完成的。
轻量级的智能指针:unique_ptr
转载地址:http://dwklf.baihongyu.com/