关于boost 的smart_ptr 的使用问题

boost 的smart_ptr 库中含有好几种智能指针,大家用的最多的应该是shared_ptr
,为啥呢?好用,不用管他啥时候会自动删除等等,而且拷贝和复制都很到位,
但实际上,这个库也有问题,连城写过一片文章,详细介绍了boost::shared_ptr库的四宗罪,不过我觉得有的问题,实际上不能怪shared_ptr,甚至boost
也给出了响应的解决方案,虽然不是完美,但也甚觉不错。 boost库中除了 shared_ptr ,还提供了 scoped_ptr, weak_ptr
两种智能指针,下面详细介绍这三种智能指针的用法以及弊端
scoped_ptr 是一个
有严格所有权的智能指针,其所有权不能转让,一旦申明一个scoped_ptr ,他就会一直拥有该对象,直到该对象失去作用自动释放。scoped_ptr
的几个重要函数原型是:template<class T>class scoped_ptr {private:   
 T *px;     scoped_ptr (scoped_ptr const & copy);  
            scoped_ptr & operator  =
(scoped_ptr  const & copy);public:     explict
scoped_ptr (T *p = 0);     ~scoped_ptr();
 
   void reset(T *p = 0);     T  & operator *
() const;     T * operator -> () const;     T *
get () const;     operator unspecified_bool_type() const; 
   void swap(scoped_ptr &
b); }
通过上述几个函数,我们就能一窥 scoped_ptr 所有权不能变更的原因了。第一:将scoped_ptr
的拷贝构造函数申明为私有的,这样外部如要调用,在编译时就已经产生违规现象了。第二:将scoped_ptr 的 赋值操作符 =
申明为私有的,也就使得像      scoped_ptr< > ptr1 = scoped_ptr
<> ptr2    
 这种用法失去了效果,在编译时就会产生违规现象了。从而使得其所有权永远牢固的掌握在scoped_ptr
最初的那个对象手中,防止了无故的滥用
从以上说明,我们可以看出,scoped_ptr
对象不能用于函数调用中,不能存放在容器中。其存放的对象,除非其主动放弃所有权(swap函数调用),不然始终是由其保管的。
从以上信息可以看出,scoped_ptr
主要用于所有权清晰,从始至终都是由一个对象保管,不会用于参数传递的对象上,一旦所有权转让了,也就失去了作为scoped_ptr
的作用了。
weak_ptr 一般来说,他是为配合shared_ptr
而引入的一种智能指针,它更像是一个助手而不是一个指针。因为其没有重载  * 和 -> 这两个最重要的 操作符,使得其有点“不像”
指针。所以,他是一个“弱”指针,他不能共享指针,不能操作资源。 但这个weak_ptr
却有另外一个用处,首先看一下他的定义template<class T>class weak_ptr{private:   
 public:     weak_ptr();     template
<class Y> weak_ptr(share_ptr <Y> const &r);   
 weak_ptr (weak_ptr const &);        
 ~weak_ptr();
     weak_ptr & operator
=(weak_ptr const &r);
     long use_count()
const;
     bool expired() const;   
      shared_ptr<T> lock()
const;
     void reset();     void
swap(weak_ptr <T> &b);};
从上面的几个接口可以看出,weak_ptr
却是是很弱的。很多东西都不提供,功能非常有限.但实际上,weak_ptr 还是有很多用处的。1、他可以使用一个非常重要的成员函数lock
从被探测的sheard_ptr 获取一个可用的shared_ptr 对象,从而操作资源(注意,如果expired() == true
则会返回一存储空指针的shared_ptr );2、他可以用来返回 this 指针:一个指向 shared_ptr
的含有自身对象的指针。如果这时候直接使用shared_ptr 容易导致很严重的循环引用,用weak_ptr 就能较好的实现避免循环引用。 
   但注意,如果一个非new
的对象,却是不能这么用的,不然在释放的时候会导致很严重的错误:释放一个栈上的对象,从而发生未定义的错误。

http://hi.baidu.com/anexx/item/3e7d7ad5d402e81620e250cb

关于boost 的smart_ptr 的使用问题,布布扣,bubuko.com

时间: 2024-12-22 19:51:51

关于boost 的smart_ptr 的使用问题的相关文章

初探boost之smart_ptr库学习笔记

概述 Boost.smart_ptr库提供了六种智能指针,除了shared_ptr 和 weak_ptr 以外还包括 scoped_ptr .scoped_array . shared_array .intrusive_ptr .他们的速度与原始指针相差无几,都是异常安全的,而且对于类型T也仅有一个要 求:类型T的析构函数不能抛出异常. 使用时包含头文件: #include<boost/smart_ptr.hpp> scoped_ptr 用法: scoped_ptr 的构造函数接受一个类型为T

boost智能指针之shared_ptr和weak_ptr

std::auto_ptr很多的时候并不能满足我们的要求,比如auto_ptr不能用作STL容器的元素.boost的smart_ptr中提供了4种智能指针和2种智能指针数组来作为std::auto_ptr的补充. shared_ptr<boost/shared_ptr.hpp>:使用shared_ptr进行对象的生存期自动管理,使得分享资源所有权变得有效且安全. weak_ptr<boost/weak_ptr.hpp>:weak_ptr 是 shared_ptr 的观察员.它不会干

C++智能指针剖析(下)boost::shared_ptr&amp;其他

1. boost::shared_ptr 前面我已经讲解了两个比较简单的智能指针,它们都有各自的优缺点.由于 boost::scoped_ptr 独享所有权,当我们真真需要复制智能指针时,需求便满足不了了,如此我们再引入一个智能指针,专门用于处理复制,参数传递的情况,这便是如下的boost::shared_ptr. boost::shared_ptr 属于 boost 库,定义在 namespace boost 中,包含头文件#include<boost/smart_ptr.hpp> 便可以使

基于C/S架构的3D对战网络游戏C++框架 _05搭建系统开发环境与Boost智能指针、内存池初步了解

本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): 1.实现基本通信框架,包括对游戏的需求分析.设计及开发环境和通信框架的搭建: 2.实现网络底层操作,包括创建线程池.序列化网络包等: 3.实战演练,实现类似于CS反恐精英的3D对战网络游戏: 技术要点:C++面向对象思想.网络编程.Qt界面开发.Qt控件知识.Boost智能指针.STL算法.STL.

Boost库中shared_ptr(上)

1.共享性智能指针(shared_ptr) 引用计数型指针 shared_ptr是一个最像指针的"智能指针",是boost.smart_ptr库中最有价值,最重要,也是最有用的.  shared_ptr实现的是引用技术型的智能指针,可以被拷贝和赋值,在任意地方共享它,当没有代码使用(此时引用         计数为0)它才删除被动态分配的对象.shared_ptr也可以被安全的放到标准容器中: 2.怎么使用shared_ptr 举一个操作的例子: #include<iostrea

Boost源码学习---weak_ptr.hpp

weak_ptr是辅助shared_ptr的智能指针.就像它的名字一样,是个"弱"指针:仅有几个接口,仅能完成很少工作.它可以从一个shared_ptr或weak_ptr对象构造,获取对资源的观测权,它是没有共享资源的,所以它的对象的创建不会引起指针引用计数的增加,它的对象的析构也不会引起计数器的减少. 它没有重载*和->,不能使用指针,主要的几个接口如下: long use_count() const//返回计数器数值 bool expired() const//判断指针是否失

Boost源码学习---scoped_ptr.hpp

scoped_ptr是一个智能指针,包装了指向堆上内存的指针.它对指针所有权加以限制,不能转让指针所有权,一旦scoped_ptr获取了指针的管理权,便不再释放,无法再从其取回来,就像scope意思一样,指针智能在作用域使用,不能转让出去.一旦离开scoped_ptr的作用域,将调用它的析构函数,释放指针,不用手动释放.下面是它的源代码: #ifndef BOOST_SMART_PTR_SCOPED_PTR_HPP_INCLUDED #define BOOST_SMART_PTR_SCOPED_

Boost源码学习---

scoped_array功能类似scoped_ptr,scoped_array管理的是new[]开辟的数组,其析构函数调用的是delete[]释放数组. 它没有重载解引用*和箭头操作符->,因为它不是普通指针,而是一个数组.它重载了[],可以像使用数组下标那样访问数组. #ifndef BOOST_SMART_PTR_SCOPED_ARRAY_HPP_INCLUDED #define BOOST_SMART_PTR_SCOPED_ARRAY_HPP_INCLUDED // (C) Copyrig

boost之智能指针

最近在看一本书<boost程序库完全开发指南>,boost是一个强大的C++程序库,丰富了C++的功能和表现力,使得C++软件开发更加简洁.优雅.灵活和高效.因为之前使用Qt做了很多项目,我发现boost和Qt有很多相似之处,比如时间.智能指针.字符串处理.函数信号槽等,在Qt中最好还是用Qt中封装好的东西来做.下面归纳最近所学习的boost只能指针知识. 一.为何要使用智能指针 C++程序员通常使用RAII机制(资源获取即初始化)来管理内存资源,在构造函数中申请资源,析构函数中释放资源.局部