Boost库中的智能指针scoped_ptr,scoped_array

C++基础之boost库的智能指针 boost 库定义在namespace boost 中,包含头文件 #include 即可使用。 Boost库中包含了几种智能指针,本文重点讨论shard_ptr。【boost::scoped_ptr】跟std::auto_ptr一样涌来管理单个堆内存对象,但是独享所有权,且不 阅读详情

一 . boost库中smart_ptr产生的原因,所发挥的作用

我们知道,为了更安全使用指针,不再让C/C++程序猿为了代码的内存管理而苦恼,VC和VS都带有智能指针auto_ptr供程序猿调用。如果还没了解建议先了解auto_ptr源代码,下面是之前对它的解析boke:
智能指针auto_ptr的解析

可无论是vc下的auto_ptr还是vs下的auto_ptr都存在设计上的缺陷,vs下的对指向空间所有权的转移是不符合人们一般习惯认识的,在智能指针对象赋值运算后,会意外让本来拥有所有权的对象失去所有权。vc下auto_ptr也会将所有权移交给对方,但自己仍有操作指向空间的权利,而没有了析构指向空间(或free)的权利,只有拥有所有权才有,但当所有权拥有着析构(free掉空间后),没有拥有权的指针再去操作,会发生错误,因为空间已经释放。
auto_ptr也不能用于数组指针,它所封装的是delete 不是delete[];

boost.smart_ ptr 库是对C++98 标准的一个绝佳补充。它提供了六种智能指针,包括
scoped.ptr、scoped array.shared_ptr、shared_ array,weak_ _ptr 和intrusive_ptr,
从各个方面来增强std: :auto_ ptr,而且是异常安全的。库中的两个类shared_ ptrweak.ptr 已被收入到C++新标准的TR1库中。
本篇我们先介绍介绍scoped_ptr、scoped_ array
它们都是很轻量级的对象,速度与原始指针相差无几,对于所指的类型T 也仅有一个很小且很合理的要求: 类型T 的析构函数不
能抛出异常。
这些智能指针都位于名字空间boost,为了使用smart_ ptr组件,需要包含头文件即:
boost/smart_ptr.hpp
boost/smart_ptr.hpp
using namespace boost;

二 . scoped_ptr
1)scoped_ptr介绍,类摘要代码分析
当然,scopy_ptr是一个和auto_ptr类似的智能指针,保证了动态创建的对象在任何时候可以被正确的释放删除,scoped_ptr顾名思义,这种智能指针只能在本作用域内使用,不可以转让。

直接从它的类摘要代码入手了解:

template<class T>
class scoped_ptr{
private:
    T *px;     //智能指针都是将原生指针封装进类中,具体的实现操作还得靠它
    scoped_ptr(scoped_ptr const &);    //特别重点的,将拷贝构造函数和赋值重载放进私有成员正是为了不被转让,只能让拥有着使用;
    scoped_ptr & operator=(scoped_ptr const &);
public:
    explicit scoped_ptr(T *p = 0);
    ~scoped_ptr();     //析构函数,实现当中肯定包含有对指针所指向空间的delete
    void reset(T *p = 0);
    T & operator*()const;
    T * operator->()const;
    T * get()const;

    operator unspecified-bool-type()const;
    void swap(scoped_ptr & b);
};

1.scoped.ptr的构造函数接受一个类型为T*的指针p,创建出一个scoped ptr 对象,并在内部保存指针参数p。
p 必须是一一个new 表达式动态分配的结果,或者是个空指针(0)。当scoped_ptr 对象的生命期结束时,
析构函数~scoped_ ptr ()会使用delete 操作符自动销毁所保存的指针对象,从而正确地回收资源。

2.scoped ptr 同时把拷贝构造函数和赋值操作符都声明为私有的,禁止对智能指针的复制操作,保证了被它
管理的指针不能被转让所有权。

3.成员函数reset () 的功能是重置scoped_ ptr: 它删除原来保存的指针,再保存新的指针值p。如果p 是空指针,
那么scoped ptr 将不持有任何指针。一般情况下reset () 不应该被调用,因为它违背了scoped.ptr 的本意一资源
应该一直由scoped ptr 自己自动管理。

4.scoped_ptr 用operator* ()和operator->() 重载了解引用操作符*和箭头操作符->,以模仿被代理的原始指针的行为,
因此可以把scoped ptr 对象如同指针一样使用。如果scoped.ptr 保存空指针,那么这两个操作的行为未定义。
scoped ptr 不支持比较操作,不能在两个scoped ptr 之间、scoped ptr 和原始指针或空指针之间进行相等或者不相
等测试,我们也无法为它编写额外的比较函数,因为它已经将operator==和operator!=两个操作符重载都声明为私有的。
但scoped ptr 提供了一个可以在bool 语境(context) 中自动转换成bool 值(如if 的条件表达式) 的功能,用来测试scoped_ ptr 是否持有一个有效的指针(非空)。它可以代替与空指针的比较操作,而且写法更简单。

2). 成员函数的解析及用法展示
成员函数讲解
explicit scoped_ptr(T* p=0)
构造函数,存储p的一份拷贝。注意,p 必须是用operator new分配的,或者是null. 在构造的时候,不要求T必须是一个完整的类型。当指针p是调用某个分配函数的结果而不是直接调用new得到的时候很有用:因为这个类型不必是完整的,只需要类型T的一个前向声明就可以了。这个构造函数不会抛出异常。

~scoped_ptr()
删除指针所指向的对象。类型T在被销毁时必须是一个完整的类型。如果scoped_ptr在它被析构时并没有保存资源,它就什么都不做。这个析构函数不会抛出异常。

void reset(T* p=0);
重置一个 scoped_ptr 就是删除它已保存的指针,如果它有的话,并重新保存p. 通常,资源的生存期管理应该完全由scoped_ptr自己处理,但是在极少数时候,资源需要在scoped_ptr的析构之前释放,或者scoped_ptr要处理它原有资源之外的另外一个资源。这时,就可以用reset,但一定要尽量少用它。(过多地使用它通常表示有设计方面的问题) 这个函数不会抛出异常。

T& operator*() const;
该运算符返回一个智能指针中存储的指针所指向的对象的引用。由于不允许空的引用,所以解引用一个拥有空指针的scoped_ptr将导致未定义行为。如果不能肯定所含指针是否有效,就用函数get替代解引用。这个函数不会抛出异常。
T* operator->() const;
返回智能指针所保存的指针。如果保存的指针为空,则调用这个函数会导致未定义行为。如果不能肯定指针是否空的,最好使用函数get。这个函数不会抛出异常。

T* get() const;
返回保存的指针。应该小心地使用get,因为它可以直接操作裸指针。但是,get使得你可以测试保存的指针是否为空。这个函数不会抛出异常。get通常在调用那些需要裸指针的函数时使用。

operator unspecified_bool_type() const
返回scoped_ptr是否为非空。返回值的类型是未指明的,但这个类型可被用于Boolean的上下文(boolean context)中。在if语句中最好使用这个类型转换函数,而不要用get去测试scoped_ptr的有效性。

void swap(scoped_ptr& b)
交换两个scoped_ptr的内容。这个函数不会抛出异常;

scoped_ptr的用法和auto_ptr几乎一样,大多数情况下它都可以与auto_ptr互相替换,它也可以从一个auto_ptr获得指针的管理权(同时auto_ptr失去管理权)。

scoped_ptr和auto_ptr一样不能用作容器的元素,但原因不同:auto_ptr是因为它的转移语义(请看上篇博客),而scoped_ptr则是因为不支持拷贝和赋值,不符合容器对元素类型的要求。

scoped_ptr和auto_ptr的根本区别在于所有权。auto_ptr特意被设计为指针的所有权是可以被转移的,可以在函数之间传递,同一时刻只能有一个auto_ptr管理指针。而scoped_ptr把拷贝构造函数和赋值函数都声明为私有的,拒绝了指针所有权的转让,只有scoped_ptr自己能够管理指针,其他任何人都无权访问被管理的指针,从而保证了指针的绝对安全。
如下代码所示:

auto_ptr<int> ap(new int(10)); //一个int自动指针
scoped_ptr<int>sp (ap);        //从auto_ptr获得原始指针
assert(ap.get() == 0);         //原auto_ptr不再拥有指针

ap.rest(new int(20));          //auto_ptr拥有新的指针
cout <<*ap<<","<<*sp<<endl;    

auto_ptr<int>ap2;
ap2 = ap;                      //ap2从ap获得原始指针,所有权转移
assert(ap.get() == 0);         //ap不再拥有原始指针
scoped_ptr<int>sp2;            //另一个scoped_ptr
sp2 = sp;                      //赋值操作,无法通过编译

如果代码企图从一个scoped_ptr构造或赋值另一个scoped_ptr(最后一行),那么编译器会报错,阻止这么做,保护了你的代码。 比起auto_ptr,scoped_ptr更明确地表明了代码原始编写者的意图;只能在定义的作用域内使用,不可转让,更明确所以在特定的场景下很适合用;

三 . scoped_array
scoped_ array 很像scoped_ ptr,它包装了new[ ]操作符(不是单纯的new) 在堆上分
配的动态数组,为动态数组提供了一个代理,保证可以正确地释放内存。
scoped_ array 弥补了标准库中没有指向数组的智能指针的缺憾。

1)scoped_array类摘要源码的解析

template<class T> class shared_array  
{  
private:  

    // Borland 5.5.1 specific workarounds  
    typedef checked_array_deleter<T> deleter;  
    typedef shared_array<T> this_type;  
public:  
    typedef T element_type;  
    explicit shared_array(T * p = 0);  
    template<class D> shared_array(T * p, D d);  
    void reset(T * p = 0);  
    template <class D> void reset(T * p, D d);  
    T & operator[] (std::ptrdiff_t i) const;     
    T * get() const;  
    bool unique() const;// never throws  
    long use_count() const; // never throws  
    void swap(shared_array<T> & other);// never throws  
    operator unspecified-bool-type() const;  
private:  

    T * px;                     // contained pointer  
    detail::shared_count pn;    // reference counter
 }; 

主要特点如下:
1,构造函数接受的指针p必须是new[]的结果,而不是new表达式的结果;
2,没有*、->操作符重载,scoped_array持有的不是一个普通指针;
3,析构函数使用delete[],而不是delete;
4,提供operator[]重载,可以像普通数组一样使用下标访问元素;
5,没有begin(),end()等类似容器迭代器操作函数。
scoped array 与scoped ptr 源于相同的设计思想,故而用法非常相似: 它只能在被声
明的作用域内使用,不能拷贝、赋值。唯一不同的是scoped._array 包装的是new[ ]产生的指针,并在析构时调用delete [],因为它管理的是动态数组,而不是单个动态象。

2)用法实例:

#include <iostream>  
#include <algorithm>  
#include <boost/smart_ptr.hpp>  
using namespace boost;  
using namespace std;  
int main(){  
    int *arr = new int[100];//a dynamically allocated array   
    scoped_array<int> sa(arr); // scoped_array object proxied original allocated array 代理原始动态数组   

    fill_n(&sa[0],100,5);//use stdandard library algorithm,fill the entire array with 5  
    sa[30] = sa[10] + sa[20];//support operator[]  
    cout << sa[30] << endl;   
    //desturctor,automatically destory resource  
}  
//运行结果是10

同学们可以去看Boost程序库完全开发指南了解更多Boost库的知识,本篇博客对scoped_ptr和scoped_ptr这对兄弟做了解析,这只是Boost库提供指针的两个,还有特别重要的shared_ptr,运用十分广泛,之后会进行解析。

boost库学习之路 boost库使用介绍安装步骤测试智能指针scoped_ptrscoped_arrayshared_ptrshared_arrayweak_ptr进程之间的通信 介绍 Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一。 Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容。在C++社区中影响甚大,是不折不扣的“准”标准库。Boost由于其对跨平台的强调,对标准C++的强调,与编写平台无关。 安装 步骤 1.下载 https 阅读详情

相关推荐

C++Boost库学习之smart_ptr库

目录 1.共享指针shared_ptr   使用例子 2.weak_ptr   使用例子 1.共享指针shared_ptr ^      使用例子 ^ #include&amp;amp;amp;amp;lt;boost/shared_ptr.hpp&amp;amp;amp;amp;gt; using namespace boost; using std::cout; using std::endl; struct A { int ...

qq_17044529的博客 919

【内存】scoped_array

1.初识scoped_array scoped_array很像scoped ptr,它包装了new[]操作符(不是单纯的new)在堆上分配的动态数组,为动态数组提供了一个代理,保证可以正确地释放内存。scoped_array相当于C++11标准中管理数组对象用法的unique_ptr. 2.类摘要 ...

Edidaughter的博客 1958

C++ boost库智能指针(一):scoped_ptr 与 scoped_array

使用scoped_ptr需要包含的头文件 #include <boost/scoped_ptr.hpp> 相比于auto_ptr, boost的scoped_ptr对指针的使用权进行转移,这是因为在scoped_ptr内部对拷贝,赋值做了私有化: template<class T> class scoped_ptr // noncopyable { private: T * px; scoped_ptr(scoped_ptr const &amp..

琅嬛福地 983

C++ Boost库:数组智能指针 scoped_array

文章目录1. 简介2. 示例代码 1. 简介 注意,scoped_ptr不能接受数组指针 scoped_ptr管理new出来的对象,scoped_array与scoped_ptr很类似它包裝了new[]操作符(而不是new)在堆上分配的动态数组,弥补了标准库中没有指向数组的智能指针的遗憾,使用需要包含头文件: #include<boost/scoped_array.hpp> 区别 scoped_array scoped_ptr 接受的指针 new[] new 内部指针

超级大洋葱的博客 1344

【BOOST C++ 1 -指针专题】02 boost::scoped_ptr

boost::scoped_ptr 是一个智能指针,它是动态分配对象的唯一所有者。 boost::scoped_ptr 无法复制或移动。此智能指针在头文件 boost/scoped_ptr.hpp 中定义。

gongdiwudu的专栏 4501

LabVIEW新手必看:5个工业自动化实战项目从零搭建(附完整代码)

本文为LabVIEW新手提供了5个从零开始的工业自动化实战项目指南,涵盖数据采集、状态机控制、PID闭环、振动监测及多站协同监控。通过详细的架构解析和关键代码片段,帮助读者快速掌握LabVIEW图形化编程的核心逻辑与工程化思维,并附完整代码实现。

agile9scrum的博客 1069

Boost开发指南-3.3scoped_array

public ://构造函数 ~ scoped_array();//析构函数 void reset(T * p = 0);//重置智能指针 T & operator [ ](std :: ptrdiff_t i) const;//重载operator[] T * get() const;//获得原始指针 explicit operator bool() const;//显式bool值转型 void swap(scoped_array & b);//交换指针 };

qq_36314864的博客 265

【UE4】Hierarchical Instanced Static Mesh——一种速度优于Spawn的实例化物体组件

最近需要在场景中实例出很多个相同的模型,位置也很有规律,并且要对它的位置信息进行更新。 但是一个个拖进去实在太麻烦,就发现了Spawn Actor这个蓝图方法,可以实例一个蓝图类在场景中。 但是由于数量较大,实例化的速度太慢,这时发现了一个神奇的组件——Hierarchical Instanced Static Mesh。 新建一个蓝图类,添加该组件,在细节里添加你要实例化的模型对象。 ...

ColorGalaxy 1万+

boost::scoped_array

1.简介    scoped_array很像scoped_ptr,它包装了new[ ]操作符(不是单纯的new)在堆上分配的动态数组,为动态数组提供了一个代理,包装可以正确地释放内存。 2. scoped_array 分析   scoped_array 的类摘要如下所示(这里列出重要部分): template<class T> class scoped_ar...

若歌的博客 456

revit二次开发环境搭建(2024版)(小白友好)

revit二次开发环境配置,SDK、addin manager和lookup新手友好安装教程

m0_56961251的博客 1419

HC32F460 FPU实战:从零开启硬件浮点加速

本文详细介绍了如何在HC32F460开发板上启用和优化FPU(浮点运算单元),以显著提升硬件浮点运算性能。从工程配置、关键代码修改到实战优化技巧,全面解析FPU加速的实现方法,并分享常见问题的解决方案,帮助开发者避免常见陷阱,充分发挥HC32F460的硬件潜力。

weixin_42620340的博客 348

指向数组的智能指针scoped_array组件的使用

scoped_array与scoped_ptr基本是一对孪生兄弟,它包装了new[]操作符(而不是new)在堆上分配的动态数组,为动态数组提供了一个代理(Proxy),保存正确地释放内存。它弥补了标准库中没有指向数组的智能指针的遗憾。 类摘要: template class shared_array { private: // Borland 5.5.1 specific w

AJIOY的专栏 1万+

Hopf振荡器在机器人步态控制里到底怎么用?一个CPG仿生案例说清楚

本文深入解析了Hopf振荡器在机器人步态控制中的实际应用,通过CPG仿生案例详细展示了从数学方程到关节指令的完整流程。重点探讨了Hopf振荡器的极限环稳定性、参数调节技巧及自适应控制策略,为机器人运动控制提供了高效解决方案。

weixin_29284657的博客 200

Boost库基础-智能指针(scoped_ptr)

smart_ptr库 boost.smart_ptr库提供了六种智能指针,包括scope_ptr、scoped_array、shared_ptr、shared_array、weak_ptr和intrusive_ptr。它们是轻量级的对象,速度和原始指针相差无几,都是异常安全的。 需要包含头文件 #include<boost/smart_ptr.hpp> using name...

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 524

HFSS实战:手把手教你设计一款小型化圆极化微带天线(附仿真文件)

本文详细介绍了使用HFSS设计小型化圆极化微带天线的完整流程,包括工程初始化、辐射贴片设计、仿真设置与优化等关键步骤。通过实战案例,帮助工程师掌握圆极化天线设计技巧,解决轴比控制和耦合馈电匹配等核心问题,适用于物联网终端和便携式设备应用。

weixin_32770423的博客 338

YOLOv13改进策略【Backbone/轻量化】| 替换骨干网络 CVPR-2024 StarNet,超级精简高效的轻量化模块

本文记录的是。StarNet设计简洁,没有复杂的设计和精细调整的超参数,仅是一个 4 阶段的分层架构。并且其中能够在低维空间计算的同时考虑极高维的特征这一特性,进而提高模型精度。本文在替换骨干网络中配置了原论文中的starnet_s1starnet_s2starnet_s3和starnet_s4七种模型,以满足不同的需求。

Limiiiing的博客 669

Boost库高效内存管理——smart_ptr库——scoped_ptr/scoped_array

Boost库有着”C++’准’标准库”之称,内容涵盖字符串处理,正则表达式,容器与数据结构,并发编程,函数式编程,泛型编程,设计模式实现等许多领域,这一篇学习Boost高效的内存管理方法 之前学习过C++11中的智能指针auto_ptr/shared_ptr/unique_ptr ,读者可以回顾一下。实质上,C++新标准的TR1库收录了Boost库中的shared_ptr和weak_ptr 智能

哒哒的博客 850

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

boost smart pointer

1. boost::scoped_ptr is a smart pointer that is the sole owner of a dynamically allocated object and cannot be copied or moved. #include <boost/scoped_ptr.hpp> #include <iostream> i...

weixin_30563319的博客 151

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Boost库智能指针学习

参见《Boost程序库完全开放指南》 第3章 内存管理 所有示例,采用vs2010开发工具(vs2005也适用),均为win32控制台程序。 Boost库的配置可参照:http://blog.youkuaiyun.com/segen_jaa/article/details/7407404。 1、scoped_ptr 内动态管理内存。但所有权不能转让,不能进行赋值操作。 示例代码如下。 #i

Segen_Jaa的专栏 5069

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Boost---boost.smart_ptr库中提供的智能指针

Boost提供了6种智能指针,包括scoped_ptr,scoped_array,shared_ptr,shared_array,weak_ptr,instrusive_ptr,从各个方面来增强std::auto_ptr,而且是异常安全的。库中的两个类——shared_ptr和weak_ptr已经被瘦如刀C++新标准的TR1库中。 这些智能指针都位于名字空间boost,为了使用smart_ptr...

. 407

Boost的智能指针

  Boost介绍 Boost是“一个免费的,可移植的,同步评测的C++库,Boost堪称是新类库的典范,特别是其中那些能够与ISO C++标准库良好的协同工作的库。”但是Boost不仅仅是一个库的集合。它也是一个快速发展的开发者社区,这些开发者创建,使用以及参与讨论Boost。这个库堪称是一个设计稳固类的精典范例。Boost库的质量和它的技术标准是十分令人惊异的。Boost可移植性标准确保了

armman的专栏 1079

作用域指针 boost::scoped_ptr

前言 作用域指针对应的类名为boost::scoped_ptr,定义在boost/scoped_ptr.hpp中。

PeterPan_hai的专栏 987

Boost之智能指针

boost.smart_ptr库提供了六种智能指针,包括scoped_ptr、scoped_array、shared_ptr、shared_array、weak_ptr和intrusive_ptr。为了使用smart_ptr组件,需要包含头文件。 Scoped_ptr scoped_ptr是一个很类似auto_ptr/unique_ptr的智能指针,但scoped_ptr的所有权更加严格,不能

optcaelum的博客 588

Boost库系列:智能指针

合理使用boost智能指针,直接内存释放问题,你只管new,不需考虑delete,甚至new也不用你new(例如由make_shared函数返回shared_ptr智能指针)。 1、头文件 &lt;boost/smart_ptr.hpp&gt;(智能指针头文件) &lt;boost/smart_ptr/make_unique.hpp&gt; (使用make_unique()函数用到) &...

weixin_33656634的博客 549

boost库智能指针回顾20200907

/* boost库中智能指针初探*/ #include "stdafx.h" #define BOOST_DATA_TIME_SOURCE #include "boost/date_time/gregorian/gregorian.hpp" #include "boost/make_shared.hpp" #include "boost/smart_ptr.hpp" using namespace boost::gregorian; using namespace std; void operate

程序员沙子的专栏 148
上一篇: 可变参函数对变参的取值工具(va_start,va_arg,va_end)
下一篇: Boost库的智能指针shared_ptr剖析
山农
博客等级 码龄10年 44粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值