《白话C++》第10章 STL和boost,Page70~72 boost::scoped_ptr

news2025/1/21 10:24:31

《泛型》篇中提到的某个IT项目的辩论会,

一派坚持智能指针和裸指针可以“离婚”,它们是std::auto_ptr的支持者,

一派认为智能指针和裸指针不可以“离婚”,boost::scoped_ptr体现了他们的观点:

boost::scoped_ptr基本用法:

void testScopePtr()
{
    boost::scoped_ptr <S> ss (new S);
    if(ss) ///判断是否不空
    {
        ss->SetA(99);
        cout << ss->a << endl;
        (* ss).SetA(100); //和裸指针一样,也可以先用*取值
        cout << (*ss).a << endl;
    }
}

同样模拟了裸指针的功能(重载了“->”和“*”操作符);

还提供了是否为空的判断(重载了“!”操作符);

禁止了裸指针的偏移计算,比如:p++、p--、p+=5、p-=2等。

既然是智能指针,正如代码所演示的,不需要手工delete。

scoped_ptr明确禁用拷贝构造和赋值操作(回忆一下boost::noncopyable),所以智能通过指针或引用的方式将scoped_ptr对象传给一个函数:

void foo4(boost::scoped_ptr<S> const& csp)
{
    csp->SetA(100);

//    delete csp.get(); //代码阻止不了某些程序原的猥琐
}

正如52行代码注释说明的,程序员有权力强行释放智能指针返回(而非release)的裸指针,这让人欲哭无泪。公司的管理人员很大一部分工作,就是发现这样的程序员,然后劝退

现在scoped_ptr身上犯错,哪怕是新手,可能性也挺小的,你看:

scoped_ptr <S> sp1(new int);

scoped_ptr <S> sp2 = sp1; //这样不OK啦
scoped_ptr <S> sp3(sp1); //这样也不OK啦

甚至在构造时都不允许使用‘=’操作了,比如

scoped_ptr <S> sp4 = new int; //编译失败,简直是道德洁癖

scoped_ptr中的“scoped”意为“区域,范围”,所以它不仅信奉“从一而终”,而且信奉“老子”的“鸡犬之声相闻,民至老死不相往来”。

因为无法复制,所以当需要传递给函数时,只能以引用或指针形式传入真身,无法传值;用作函数返回值也一样。

scoped_ptr不支持在对象间复制,转移裸指针,但如果它对裸指针不满意,那它可以“谋杀”这个裸指针,然后自行换个新的,这个“谋杀”函数就是“reset()”:

scoped_ptr sp1(new int);
sp1.reset();//所拥有的指针被内部delete掉了
assert(!sp1);

调用reset()之后,sp1又恢复了自由身,现在它不拥有任何裸指针了,直到它看上新的:

boost::scoped_ptr <int> sp1 (new int);
*sp1 = 38;
sp1.reset(); //释放原有裸指针,恢复自由身
sp1.reset(new int(22)); //改为拥有传入的新指针
cout << *sp1 << endl;

甚至可以在“在谋杀的同时,娶的新人”:

boost::scoped_ptr <int> sp1(new int);
*sp1 = 38;
sp1.reset(new int(22)); //释放原有,改拥新指针

两个scoped_ptr可以交换所拥有的裸指针,方法是通过成员函数swap();

boost::scoped_ptr<int> sp1(new int(0));
boost::scoped_ptr<int> sp2(new int(1));
cout << *sp1 << endl;
cout << *sp2 << endl;
sp1.swap(sp2);
cout << *sp1 << endl;
cout << *sp2 << endl;

从一个指针管理的功能来看,释放指针(reset),释放指针并替换为新指针(reset(newPtr))、高效地交换两个指针都是必要的,这些功能也都不容易使用出错。

boost::scoped_ptr最本质的改进,就是不允许拥有权的“潜式”转移,也不提供直接交出所有权的操作(类似auto_ptr的release()函数)。

有关scoped_ptr最后也是最重要的问题是:一个变量只在一定范围(scope)内私用,可以自动释放,那不就是“栈”变量吗?为什么一定要使用scoped_ptr?对比一下代码:

使用栈变量使用“scoped_ptr”

void foo()

{

        int a = 10;

        cout << a << endl;

        ...

}

void foo()

{

        scoped_ptr <int> a (new int(10));

        cout << *a << endl;

        ...

}

很明显,右边使用的“scoped_ptr”方式纯属折腾,看不出任何必要性。

“面向对象”编程时,经常需要使用基类类型的指针,指向或创建派生类;如果有多种派生类,往往需要在运行期才能决定创建哪类对象,此时通常需要使用new操作以动态创建。如果这个堆对象正好符合“此处用完就删除”的特性,就可以使用scoped_ptr加以管理:

Foo函数中事先并不知道将创建AirPlane或Duck的对象,因此需要使用基类指针从堆中动态创建对象,而为了管理该堆对象,可以使用scoped_ptr。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1454984.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenAI视频生成模型Sora的全面解析:从扩散Transformer到ViViT、DiT、VideoPoet

前言 真没想到&#xff0c;距离视频生成上一轮的集中爆发才过去三个月&#xff0c;没想OpenAI一出手&#xff0c;该领域又直接变天了 自打2.16日OpenAI发布sora以来&#xff0c;不但把同时段Google发布的Gemmi Pro 1.5干没了声音&#xff0c;而且网上各个渠道&#xff0c;大量…

NHANES数据库使用(1)

官网&#xff1a;NHANES - National Health and Nutrition Examination Survey Homepagehttps://www.cdc.gov/nchs/nhanes/index.htm 1、打开数据库 2、 选择数据集 B区检索方法和变量。C区检索数据集。A区含有B区和C区的功能。选择 NHANES 2017-March 2020打开。 3、打开数据…

普通人做抖音小店真的能赚钱吗?别在做美梦了,都醒醒吧!

大家好&#xff0c;我是电商糖果 糖果做电商七年了&#xff0c;这中间也起起落落过&#xff0c;2020年开始做抖音小店。 虽然靠着小店自己有了团队&#xff0c;翻了身。 但是只要有人问糖果&#xff0c;普通人做抖音小店真的能赚到钱吗&#xff1f; 我的回答依旧是看个人。…

最长子串和回文子串相关的算法题解

这里写目录标题 一、3. 无重复字符的最长子串二、5. 最长回文子串三、647. 回文子串四、516. 最长回文子序列 一、3. 无重复字符的最长子串 中等 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释:…

ClickHouse从入门到精通(高级)

第1章 Explain查看执行计划 第2章 建表优化 第3章 ClickHouse语法优化规则 第4章 查询优化 第5章 数据一致性(重点) 第6章 物化视图 第7章 MaterializeMySQL引擎 第8章 常见问题排查

阿里云香港轻量应用服务器怎么样,建站速度快吗?

阿里云香港服务器中国香港数据中心网络线路类型BGP多线精品&#xff0c;中国电信CN2高速网络高质量、大规格BGP带宽&#xff0c;运营商精品公网直连中国内地&#xff0c;时延更低&#xff0c;优化海外回中国内地流量的公网线路&#xff0c;可以提高国际业务访问质量。阿里云服务…

智慧城市与数字孪生:实现城市可持续发展的关键

一、引言 随着全球城市化进程的加速&#xff0c;城市面临着诸多挑战&#xff0c;如资源紧张、环境恶化、交通拥堵等。为了解决这些问题&#xff0c;智慧城市的概念应运而生。智慧城市利用先进的信息通信技术&#xff0c;提升城市治理水平&#xff0c;改善市民的生活质量。而数…

基于8086单片机的数码管计时系统[proteus仿真]

基于8086单片机的数码管计时系统[proteus仿真] 8086仿真设计这个题目算是课程设计中常见的题目了&#xff0c;本期是一个基于8086单片机的数码管计时系统[proteus仿真] 需要的源文件和程序的小伙伴可以关注公众号【阿目分享嵌入式】&#xff0c;赞赏任意文章 2&#xffe5;&a…

IPsec、安全关联、网络层安全协议

网络层安全协议 IP 几乎不具备任何安全性&#xff0c;不能保证&#xff1a; 1.数据机密性 2.数据完整性 3.数据来源认证 由于其在设计和实现上存在安全漏洞&#xff0c;使各种攻击有机可乘。例如&#xff1a;攻击者很容易构造一个包含虚假地址的 IP 数据报。 IPsec 提供了标…

从零开始做题:逆向 ret2libc jarvisoj level1

1.题目信息 BUUCTF在线评测 2.原理 篡改栈帧上的返回地址为攻击者手动传入的shellcode所在缓冲区地址&#xff0c;并且该区域有执行权限。 3.解题步骤 3.1 首先使用checksec工具查看它开了啥保护措施 基本全关&#xff0c;栈可执行。 rootpwn_test1604:/ctf/work/9# chec…

RabbitMQ之 Direct 交换机

&#x1f47d;System.out.println(“&#x1f44b;&#x1f3fc;嗨&#xff0c;大家好&#xff0c;我是代码不会敲的小符&#xff0c;双非大四&#xff0c;Java实习中…”); &#x1f4da;System.out.println(“&#x1f388;如果文章中有错误的地方&#xff0c;恳请大家指正&a…

【python】python入门(变量名)

Hi~ o(*&#xffe3;▽&#xffe3;*)ブ今天一起来看看python入门之变量名吧~~ 变量名的规定&#xff1a; 举个例子&#xff1a; “违法”的变量名们 my love/my &#xff01;love错误&#xff1a;中间不能是空格或者其他符号1my_love错误&#xff1a;不能数字开头"my_l…

【Spring底层原理高级进阶】轻松掌握 Spring MVC 的拦截器机制:深入理解 HandlerInterceptor 接口和其实现类的用法

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《Spring 狂野之旅&#xff1a;底层原理高级进阶》 &#x1f680…

区块链技术和Hyperledger Fabric介绍

1 区块链介绍 1.1 区块链技术形成 1.1.1 起源 在比特币诞生之时&#xff0c;技术专家们开始研究比特币的底层技术&#xff0c;并抽象提取出来&#xff0c;形成区块链技术&#xff0c;或者称分布式账本技术。 1.1.2 定义 简称BT&#xff08;Blockchain technology&#xff…

包教包会的Kotlin Flow教程

原文链接 包教包会的Kotlin Flow教程 公众号「稀有猿诉」 Kotlin中的Flow是专门用于处理异步数据流的API&#xff0c;是函数响应式编程范式(Functional Reactive Programming FRP)在Kotlin上的一个实现&#xff0c;并且深度融合了Kotlin的协程。是Kotlin中处理异步数据…

【PCIE709-F】基于复旦微JFM7VX690T80 FPGA的全国产化8通道光纤双FMC接口数据处理平台

板卡概述 PCIE709-F是一款基于上海复旦微电子的28nm 7系列FPGA JFM7VX690T80的全国产化8通道光纤双FMC接口数据预处理平台&#xff0c;该板卡采用复旦微的高性能7系列FPGA作为实时处理器&#xff0c;实现4路10G SFP光纤以及1路QSFP通信接口、实现1路X8 PCIE数据传输的功能。板载…

using--基础

using 关键字的作用 using声明---using declaration 就是声明一个已经存在的命名空间&#xff0c;命名空间成员&#xff0c;枚举&#xff0c;类成员对象等。 声明实现的原理 在 C 中&#xff0c;变量的声明并不等于变量的实现&#xff0c;变量声明只是告诉编译器该变量的名…

离谱!用ChatGPT进行审稿!

离谱&#xff01;用ChatGPT进行审稿&#xff01; 关注微信公众号: DeepGoAI 在这个信息爆炸的时代&#xff0c;AI已经跑到了学术会议的后台&#xff0c;偷偷摸摸地开始“帮忙”审稿了&#xff01;&#x1f916; 最近&#xff0c;一位教授的LinkedIn动态可谓是火了一把&#xf…

Android 基础技术——HashMap

笔者希望做一个系列&#xff0c;整理 Android 基础技术&#xff0c;本章是关于HashMap HaspMap的默认初始长度是16&#xff0c;并且每次扩展长度或者手动初始化时&#xff0c;长度必须是2的次幂。 为什么长度是2的x次幂和每次扩容都是2倍?? 1&#xff09;当一个key被放进到数…

大数据,对于生活的改变

谷歌通过对于疾病的查询量可以预测一个个h1n1病毒的大爆发&#xff0c; 大数据时代对于人的考验 用户的搜索记录就是一种信息&#xff0c;这种信息会满足其基础相关的词条与其有关的词条&#xff08;最为原始的搜索机制&#xff0c;国内的搜索引擎都是采用这种基础原理。&…