智能指针之scoped_ptr

智能指针之 scoped_ptr scoped_ptr是一个类似于auto_ptr的智能指针,它包装了new操作符在堆上分配的动态对象,能够保证动态创建的对象在任何时候都可以被正确的删除。但是scoped_ptr的所有权更加严格,不能转让,一旦scoped_pstr获取了对象的管理权,你就无法再从它那里取回来。正如scoped_ptr(局部指针)名字的含义:这个智能指针只能在作用域里使用,不希望被转让。代码实现如下:template 阅读详情

scoped_ptr是一个类似auto_ptr的智能指针,scoped_ptr可以保证new操作符在堆上创建的对象在任何时候都可以被正确的删除。
scoped_ptr的最大特点就是一旦scoped_ptr拥有了某个对象的所有权,就无法再次取回!

scoped_ptr的构造函数:

scoped_ptr(T *p=0):px(p)
{
}
//其接受T*类型的指针p,创建出对象,并在该对象内部保存指针参数p,此处p必须是一个new动态分配的结果,或者是一个空指针

scoped_ptr的析构函数:

~scoped_ptr()
{
     delete px;
}
//对象的生命周期结束后,析构函数调用delete自动销毁所保存的对象

scoped_ptr为了保证被其管理的指针的所有权不被转移,就将其拷贝构造和赋值函数设置为私有的:

private:
    T *px;
    scoped_ptr(scoped_ptr cosnt &);
    scoped_ptr& operator=(scoped_ptr const &);

scoped_ptr的成员函数reset():重置scoped_ptr,删除原来保存的指针,再保存新的指针,若新指针为空,则scoped_ptr将不持有任何指针:

void reset(T *p = 0)
{
    T(p).swap(*this);
}
void swap(scoped_ptr &b)  //交换两个scoped_ptr保存的指针
{
     _T *tmp = b.px;
     b.px = px;
     px = tmp;
}

scoped_ptr不支持比较操作,不能判断两个指针的相等或不相等,因为其operator== 和 operator!= 操作被声明为私有的:

private:
    void operator==(scoped_ptr const &)const;
    void operator!=(scoped_ptr const &)const;

scoped_ptr的成员函数get():得到scoped_ptr内部保存的指针,不可对该指针进行delete操作,否则会在scoped_ptr析构时会对已经删除的指针再进行删除操作:

T *get()const
{
     return px;
}

注意:
scoped_ptr不再需要delete操作scoped_ptr会自动释放资源

以下是我对scoped_ptr的测试:

#include<iostream>
#include<memory>
#include<boost/smart_ptr.hpp>

using namespace std;
using namespace boost;


//scoped_ptr不需要delete操作,因其会自动释放资源
//scoped_ptr不能进行拷贝构造,所以不能执行scoped_ptr<int> ps = p;(错误)
int main()
{
    scoped_ptr<int> p1;
    int *p = new int(10);
    scoped_ptr<int> ps(p);
    cout<<*ps<<endl;
    cout<<*p<<endl;

    *ps = 20;
    cout<<*ps<<endl;
    //p1 = ps;   //scoped_ptr不支持赋值和拷贝构造,因为其是私有操作

    int *q = new int(30);
    ps.reset(q);   //重置
    cout<<*ps<<endl;

    int *m = new int(40);
    auto_ptr<int> ps1(m);
    scoped_ptr<int> ps2(ps1);
    cout<<*ps2<<endl;
    //cout<<*ps1<<endl;  //其拥有权已被转移至scoped_ptr的ps2,该指针已经指向空
    ps1.reset(new int(50));
    cout<<*ps1<<endl;

    return 0;
}
C++学习之智能指针--auto_ptr、scoped_ptr、scoped_array、shared_ptr、shared_array、weak_ptr 本文主要讲解C++primer中的智能指针和句柄的概念,以及标准库中的 阅读详情

相关推荐

C++智能指针 unique_ptr (scoped_ptr)

首先提出: scoped_ptr是boost库中对这个只能指着的叫法,unique_ptr是C++11标准库中对这个智能指针的叫法 上一篇我们讲解了智能指针中的auto_ptr,但是auto_ptr中还是有很大的缺陷,于是在boost库中,各位民间大佬提出了另外几种智能指针,分别是 scoped_ptr,shared_ptr,还有配合shared_ptr使用的weak_ptr 这一片我们讲解一...

J4Ya_的博客 2527

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

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

【内存】scoped_ptr

1.初识scoped_ptr scoped_ptr是一个与auto_ptr/unique_ptr很类似的智能指针,它包装了new操作符在堆上分配的动态对象,能够保证动态创建的对象在任何时候都可以被正确地删除。但scoped_ptr的所有权更加严格,不能转让,一旦scoped_ptr获取了对象的管理权,我们就无法再从它那里收回来。scoped_ptr拥有一个很好的名字,它向代码的阅读者传递了明确的信息:这个智能指针只能在本作用域里使用,不希望被转让。 2. ...

Edidaughter的博客 2436

乐鑫ESP32-C6产测全流程:RAM固件测试与阈值校准实战指南

Wi-Fi模组量产测试是保障IoT设备射频性能与硬件可靠性的关键环节,其核心在于基于RAM的无损固件加载、可配置的阈值判定机制及多工位协同控制。该流程依托串口协议与结构化配置(如JSON阈值文件、.bin测试固件),实现RF性能(fb_rssi、tx_power)、GPIO导通性、Flash ID识别与固件版本校验等原子化测试项的自动化执行。技术价值体现在避免Flash擦写风险、支持动态温补与在线学习校准,并无缝对接MES系统实现质量数据闭环。典型应用场景包括ESP32-C6/C3/S2等乐鑫全系Wi-Fi

weixin_35756690的博客 310

HDRP shader 获取阴影(Custom Pass)

Unity:2021.3.0f1 HDRP:12.1.6

LanQ的博客 2097

【C++】智能指针简述(三):scoped_ptr

  在介绍scoped_ptr之前,我们先回顾一下前两篇文章的内容.   首先,智能指针采用RAII机制,通过对象来管理指针,构造对象时,完成资源的初始化;析构对象时,对资源进行清理及汕尾.   auto_ptr,通过转移管理权来完成对象的拷贝与赋值,在实际开发中并不实用.   回顾完智能指针的背景及auto_ptr的特性之后,本文来介绍scoped_ptr的实现原理及特性.   scop...

weixin_30847865的博客 335

《MySQL高级篇》十四、多版本并发控制

《MySQL高级篇》十四、多版本并发控制

LXYDSF的博客 3991

chromium源码阅读(2)-智能指针scoped_ptr

scoped_ptr,顾名思义,是被设计用来管理指针的声明周期的。在指针对象离开当前作用域后,scoped_ptr负责清理销毁指针对象,从而避免c++程序员管理内存的负担。 1、scoped_ptr用法1)scoped_ptr{ scoped_ptr<Foo> foo(new Foo("wee")); } // foo goes out of scope, releasing the

xdgs_2005的专栏 810

小红书x-mini签名逆向实战:Frida动态Hook与算法还原

在移动App协议分析中,请求签名机制是保障接口安全的核心技术,其本质是客户端对请求参数、时间戳、设备指纹等要素进行加密认证的过程。理解签名原理需掌握Native层加密流程、JNI调用机制及密钥动态派生逻辑。Frida作为主流动态插桩工具,能绕过符号剥离、字符串加密和控制流混淆等反分析手段,在函数执行瞬间捕获寄存器状态、内存数据与调用上下文,实现签名算法的完整还原。该技术广泛应用于合规内容监测、API自动化调用与竞品协议研究等工程场景。本文聚焦小红书x-mini签名这一典型样本,详解从JNI_OnLoad定位

weixin_31264565的博客 457

Python爬虫实战:抓取CVE安全漏洞数据库

在网络安全领域,CVE(Common Vulnerabilities and Exposures)是一个非常重要的安全漏洞字典,它为每个安全漏洞提供了唯一的标识符。安全研究人员、开发人员和系统管理员都需要及时了解最新的CVE信息,以便采取相应的防护措施。本文将详细介绍如何使用Python爬虫技术从专业CVE网站抓取漏洞数据,并构建一个完整的CVE信息采集系统。本文详细介绍了如何使用Python爬虫技术从专业CVE网站抓取安全漏洞数据。多种爬虫技术反爬虫策略:User-Agent轮换、代理IP、请求延迟。

2201_76125261的博客 367

智能指针scoped_ptr

对应C++11中的unique_ptr       #include &lt;iostream&gt; #include &lt;memory&gt; class foo { public: foo() { std::cout&lt;&lt;"constructor"&lt;&lt;std::endl;} ~foo() { std...

weixin_33672109的博客 204

从 OA 门户到 SAP 的单点登录全景解析

OA(Office Automation)门户往往已与企业身份证明源(Microsoft Entra ID、LDAP 等)集成。管理员希望:员工在 OA 登陆后访问 SAP Fiori Launchpad、OData API 或 RFC 接口时无需再次输入账号密码,而 SAP 仍能识别用户身份并执行基于角色的授权。此时 OA 可以直接充当 IdP,也可以把企业 IdP 发放的令牌转发给 SAP 充当 SP(service provider)。SAP Help Portal 将这类跨系统认证称为 single

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 996

boost::scoped_ptr智能指针

1. 简介   scoped_ptr是boost库提供的很类似auto_ptr的智能指针,它包装了new操作符在堆上分配的动态对象,能够保证动态创建的对象在任何时候都可以被正确地删除。在实现上都是利用了一个栈上的对象去管理一个堆上的对象,从而使得堆上的对象随着栈上的对象销毁时自动删除。但scoped_ptr的所有权更加严格,不能转让,并且永远不能被复制或赋值,一旦scoped_ptr获取了对象的

huangjh2017的博客 2024

uniapp - 解决在线预览PDF文件空白打不开的问题,无论是后端下载二进制文件流pdf还是本地插件或JS预览查看打开白屏不显示,详细排查解决(适用于移动端H5网页、安卓/苹果app、微信小程序)

uniapp App端 实现pdf文件预览打开白屏解决,uniapp 在线预览pdf打开一片空白,跨域白屏,uni-app中使用WebView预览PDF文件打开空白,微信小程序(uniapp)预览PDF空白怎么办,下载PDF文件流后打开空白或无法打开的问题,Uniapp H5网页下载二进制pdf文件页面空白以及解决文件损坏打不开的情况,Uniapp app在线预览pdf文件流,PDF加载出来怎么办,服务器后端返回PDF文件流后前端进行下载但打开后一片白屏,解决pdf文件流,预览全是空白页,pdf文件流,下载

🏆 前端领域优质创作者 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C++ boost智能指针scoped_ptr

头文件: "boost/scoped_ptr.hpp" boost::scoped_ptr 用于确保动态分配的对象能够被正确地删除。scoped_ptr有着与std::auto_ptr类似的特性,而最大的区别在于它不能转让所有权,然而auto_ptr却可以。事实上,scoped_ptr永远不能被复制或被赋值!scoped_ptr拥有它所指向的资源的所有权,并永远不会放弃这个所有权。scoped

晴天的专栏 1744

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

智能指针:auto_ptr 和 scoped_ptr

很多人都说:C++比Java难,难就难在指针,指针很难学,但是不可否认,通过指针,我们确实将很多问题解决了,不过为什么要引入指那个指针呢?首先这里先声明一点:智能指针并不是指针,它的本质是个类,不过,它的功能是自动管理指针所指向的动态内存和释放工作,所以叫他智能指针。那么为什么要引入智能指针呢?先来看一个例子:int FunTest() { int *p = new int; if

jhcconan614的博客 2163

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

计算机控制技术及应用

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

Boost智能指针——scoped_ptr和shared_ptr

Boost智能指针——scoped_ptr boost::scoped_ptr和std::auto_ptr非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放。下列代码演示了该指针的基本应用: #include  #include  #include  class implementation { public:     ~im

不能只做码农 1万+

Boost智能指针——scoped_ptr

boost智能指针——scoped_ptr boost::scoped_ptr和std::auto_ptr非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放。下列代码演示了该指针的基本应用 #include  #include  #include  class implementation { public:

kevin_Android_123456的专栏 814

智能指针——auto_ptr、shared_ptr、weak_ptr、scoped_ptr

一句话总结: 1、auto_ptr 能够拷贝,能够转移所有权 2、scoped_ptr  不能拷贝,不能转移所有权 #include #include #include using namespace boost; using namespace std; class Test{ public:     T

Simon的博客 1万+

智能指针的模拟实现 auto_ptr scoped_ptr shared_ptr

RAII(Resource Acquisition Is Initialization)资源分配即初始化,定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放。智能指针:用自动化或者说智能的指针来实现对动态内存的释放。它是一个类,有类似指针的功能。常见的智能指针:auto_ptr/scoped_ptr/scoped_array

fucangzxx的博客 714

智能指针(scoped_ptr的实现)

1.实现原理: 它的实现原理是为了防止对象拷贝和赋值,它与auto_ptr的共同之处是scoped_ptr和auto_ptr都是利用一个栈上的对象去管理一个堆上的对象,从而使得堆上的对象随着栈上对象的销毁自动删除。但是,其不可以将指针所有权转让,只能在作用域内使用。这也就意味着他不能作为函数的返回值,不能共享所有权 同时它也不能管理数组对象,它是通过delete来删除对象的。 2.为什么要将拷贝构...

xiaodu655的博客 543

智能指针 scoped_ptr

scoped_ptr:  scoped_ptr是一个类似auto_ptr的智能指针,它包装了new操作符在堆上分配的动态对象,能够保证动态创建的对象在任何时候都可以被正确的删除。  特征:scoped_ptr的所有权不能转让。 操作函数:  scoped_ptr的构造函数接受一个类型为T*的指针p,创建出一个scoped_ptr对象, 并在内部保存指针参数p,p必须是一个new表达式动态

mmzsyx的专栏 1314
上一篇: C++实现一个简单的红黑树(RB_TREE)
下一篇: fork函数
lm_123_456
博客等级 码龄11年 35粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值