[Effective C++]条款15:在资源管理类中提供对原始资源的访问

Effective C++ 详解条款15: 在资源管理类中提供对原始资源的访问 假期归来第一天!!!!学习起来up up up ღ( ´・ᴗ・` )ღ比心 由条款13导入一个例子:使用智能指针如auto_ptr或 tr1: :shared ptr保存factory函数如createInvestment的调用结果: std::tr1::shared_ ptr<Investment> pInv (createInvestment()); //见条款13 假设你希望以某个函数处理Investment对象,像这样: int daysHeld (const Investment*. 阅读详情

在C++中,使用RAII方式管理动态内存资源时,通常会将资源封装在一个类中。当需要获取类内部的原始资源时,可以通过以下几种方式实现:

1、显示转换函数

  • 通过提供一个显示的成员函数来获取原始资源。明确获取资源的意图。
class ResourceManager {
public:
    ResourceManager() : resource(new int(42)) {}
    ~ResourceManager() { delete resource; }

    // 显式获取原始资源
    int* get() const {
        return resource;
    }

private:
    int* resource;
};

int main() {
    ResourceManager rm;
    int* rawResource = rm.get();  // 显式获取资源
    std::cout << *rawResource << std::endl;  // 输出: 42
    return 0;
}

2、隐式转换函数

  • 通过重载函数转换运算符,使的资源管理类可以隐式转换为原始资源类型。这种方式虽然方便,但可能会引起意外的隐式转换。
class ResourceManager {
public:
    ResourceManager() : resource(new int(42)) {}
    ~ResourceManager() { delete resource; }

    // 隐式转换为原始资源类型
    operator int*() const {
        return resource;
    }

private:
    int* resource;
};

int main() {
    ResourceManager rm;
    int* rawResource = rm;  // 隐式转换为 int*
    std::cout << *rawResource << std::endl;  // 输出: 42
    return 0;
}

隐式转换函数获取原始资源,可能导致的问题

#include <iostream>

class ResourceManager {
public:
    ResourceManager() : resource(new int(42)) {}
    ~ResourceManager() { delete resource; }

    // 隐式转换为原始资源类型
    operator int*() const {
        return resource;
    }

private:
    int* resource;
};

void printValue(int* value) {
    std::cout << "Value: " << *value << std::endl;
}

int main() {
    ResourceManager rm;

    // 问题1:隐式转换导致意外的行为
    printValue(rm);  // 这里隐式调用了 operator int*()

    // 问题2:资源管理混乱
    int* rawResource = rm;  // 隐式转换为 int*
    delete rawResource;     // 错误:重复释放资源!

    // 问题3:代码可读性降低
    // 以下代码看起来像是在操作 ResourceManager,但实际上是在操作 int*
    *rm = 100;  // 这里隐式调用了 operator int*()
    std::cout << "Modified value: " << *rm << std::endl;

    return 0;
}

3、使用智能指针

  • 使用标准库提供的智能指针提供的get()方法获取原始资源
#include <memory>
#include <iostream>

int main() {
    std::unique_ptr<int> resource(new int(42));
    int* rawResource = resource.get();  // 获取原始资源
    std::cout << *rawResource << std::endl;  // 输出: 42
    return 0;
}

思维导图笔记:
在这里插入图片描述

Jmeter压测报告 账户分析压测报告 一、测试内容 本次测试是针对账户分析进行的压力测试,在账户分析查询接口中,只对用户资产查询接口进行压力测试,其中不包含用户签名校验功能。 二、测试方法 本次采用apache的开源测试工具jmeter,采用本地动态拼装请求数据并通过http协议GET方式发送每日盈亏查询请求。并采用1000个用户账号测试访问情况。... 阅读详情

相关推荐

SQLSTATE58030

在优化一条SQL的时候遇到了执行错误 gtlions =# select t1.telnumber,t2.ua,t2.url,t1.apply_name,t2.apply_name from tb1 t1 gtlions -# left outer join tb2 t2 on t1.sid = t2.ipsid gtlions-# where t1.sum_date=20141128 a

Gtlions Tracker 3660

Effective C++ 条款15:在资源管理类中提供对原始资源的访问

深入解析 RAII 资源管理类中原始资源访问的设计,探讨显式转换与隐式转换的权衡,以及在实际开发中的应用策略

凡人叶枫的博客 332

FPGA新手必看:用USB转TTL实现串口通信的完整流程(附CH340G电路详解)

本文为FPGA新手提供了通过USB转TTL模块实现串口通信的完整实战指南。详细解析了CH340G电路设计要点、硬件连接方法,并分享了经过验证的Verilog代码框架,帮助读者快速掌握FPGA与PC通信的核心技术,解决电平匹配与波特率设置等常见问题。

cake8的博客 1049

Effective C++之条款15:在资源管理类中提供对原始资源的访问

声明: 文中内容收集整理自《Effective C++(中文版)第三版》,版权归原书所有。 本内容在作者现有能力的基础上有所删减,另加入部分作者自己的理解,有纰漏之处敬请指正。 条款15:在资源管理类中提供对原始资源的访问 Provide access to raw resources in resource-managing classes. 使用资源管理类(resource-mana...

HakunaMatata的博客 289

交通小白首投TRB就中Oral?我的完整时间线与避坑指南(附Editorial Manager实操截图)

本文详细解析了交通领域新手如何高效完成TRB国际会议投稿的全流程,从选题策略到投稿系统实操,再到评审过程解析和常见误区避坑指南。特别针对初次投稿者提供了实用建议,包括时间规划、选题考量、Editorial Manager系统操作技巧,以及如何应对评审意见。文章还分享了从录用到会议参与的关键步骤,帮助研究者提升投稿成功率。

weixin_27303545的博客 386

顶刊《会计研究》数据复现|最新上市公司数智化数据

本文基于Python文本分析方法构建了中国A股上市公司数智化指标(1991-2024),通过识别年报中的"机器学习""智能医疗"等关键词,量化企业数字化与智能化融合程度。研究发现数智化企业更倾向于非正式渠道的定性披露以规避风险,该指标为监管完善信披规则提供了参考。研究还揭示了数智化对企业信息披露策略的转变,并提出了未来研究方向,包括数智化对绿色创新、ESG表现等影响机制。数据覆盖非金融类上市公司,采用文本挖掘技术构建结构化指标,为相关领域研究提供了微观基础。

PPdata_Academy的博客 1487

effective c++ 条款15:在资源管理类中提供对原始资源的访问

记住: APIs往往要求访问原始资源,所以每一个RAII类应该提供一个“取得其所管理之资源”的办法。 对原始资源的访问可能经由显示转换或隐式转换。一般而言显示转换比较安全,但隐式转换对客户比较方便。 std::tr1::shared_ptr<Investment> pInv(createInvestment()); int daysHeld(const Investment* pi); int days = daysHeld(pInv); //错误 int days = daysHeld

qq_18059143的博客 209

AutosarMCAL开发——基于EB MCU驱动

本文为博主个人学习总结记录,如有不正,欢迎指正。

qq_45583706的博客 921

[Effective C++]条款15 在资源管理类中提供对原始资源的访问

我们将资源存入资源管理类, 为的是可以免去资源管理的麻烦, 但同时我们也希望可以正常合理地通过资源管理类来使用资源, 就像直接使用资源一样, 为此我们一定需要在资源管理类中提供对原始资源的访问.

tianmu_sama的博客 498

手把手教你学PCIE--所有 PF(Physical Function)共同管理和分配 VF

但具体如何分配和使用 VF 取决于硬件设计、驱动程序配置以及实际应用场景。

MHD0815的博客 1462

视觉Transformer实战 | Cross-Attention Multi-Scale Vision Transformer(CrossViT)详解与实现

Vision Transformer (ViT) 在计算机视觉领域取得了巨大成功,但标准 ViT 结构在处理不同尺度的视觉特征时存在局限性。双分支 ViT (Cross-Attention Multi-Scale Vision Transformer, CrossViT) 通过引入双分支结构来解决这一问题,能够同时捕获局部和全局视觉特征。本文将详细介绍 CrossViT 的技术原理,并使用 PyTorch 从零开始实现 CrossViT 模型。

盼小辉丶的博客 722

Effective C++ 学习笔记 条款15 在资源管理类中提供对原始资源的访问

是否该提供一个显式转换函数(例如get成员函数)将RAII class转换为其底部资源,或是应该提供隐式转换,答案主要取决于RAII class被设计执行的特定工作,以及它被使用的情况。假设有大量与字体相关的C API,它们处理的是FontHandle,那么“将Font对象转换为FontHandle”会是一种很频繁的需求。某些程序员可能会认为,这样到处要求显式转换,让人倒尽胃口,不愿再使用这个class,从而增加了泄露字体的可能性,而Font clsss的主要设计目的就是为了防止资源(字体)泄漏。

tus00000的博客 741

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Effective C++ 条款 15:在资源管理类中提供对原始资源的访问

RAII 类应该提供一种安全的方式,让用户访问其管理的原始资源。显式转换(如get)通常是首选,因为它安全且明确。在特定场景下可以提供隐式转换,但需谨慎处理以避免意外的行为。

weixin_42255569的博客 465

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Effective C++条款15:在资源管理类中提供对原始资源的访问

一、在资源管理类中提供对原始资源的访问 在前面的文章中我们使用到了C++提供的智能指针以及自己封装的资源管理类,这些类中我们将资源封装在class内部。但是在很多情况下我们需要直接使用到这些资源,所以需要提供一些方法直接使用到这些内部资源,例如shared_ptr的get函数等 演示说明 创建一个类 class Investment {}; 创建一个函数,会返回一个Investment指针对象 Investment* createInvestment(); 我们使用shared_ptr类来管理

www_dong的博客 237

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Effective C++条款15:资源管理之(在资源管理类中提供对原始资源的访问)

一、在资源管理类中提供对原始资源的访问 在前面的文章中我们使用到了C++提供的智能指针以及自己封装的资源管理类,这些类中我们将资源封装在class内部。但是在很多情况下我们需要直接使用到这些资源,所以需要提供一些方法直接使用到这些内部资源,例如shared_ptr的get函数等 演示说明 创建一个类 class Investment {}; 创建一个函数,会返回一个Investment指...

董哥的黑板报 697

《Effective C++》条款15、资源管理类提供原始资源的访问

显示转换 在我们的资源管理类中,有时我们需要使用到我们的原始类,所以我们需要在资源管理类中提供对原始资源的访问接口,在智能指针中,都提供了一个get()函数,这个函数使得我们能够获得智能指针内部封装的原始指针,同时智能指针也重载了*运算符和->运算符使得我们可以访问内部指针指向的资源。 如果我们在我们自己的资源管理类中也同样的封装了一个原始类,同样的,我们需要提供我们的原始资源,对于一个字体的管理类。我们同样可以提供一个get()函数返回我们的原始资源。 如果想要获得FontHandle类型的 f

qq_44664843的博客 236

Effective C++条款15——在资源管理类中提供对原始资源的访问(资源管理)

你的内心也可能认为,RAll class内的那个返回原始资源的函数,与“封装”发生矛盾。它们是你对抗资源泄漏的堡垒。是否该提供一个显式转换函数(例如get成员函数)将RAII class转换为其底部资源,或是应该提供隐式转换,答案主要取决于RAIl class被设计执行的特定工作,以及它被使用的情况。某些程序员可能会认为,如此这般地到处要求显式转换,足以使人们倒尽胃口,不再愿意使用这个class,从而增加了泄漏字体的可能性,而Font class 的主要设计目的就是为了防止资源(字体)泄漏。

StudyWinter的博客 361

[Effective C++]条款15:在资源管理类中提供对原始资源的访问

APIS 往往要求访问原始资源,所以每一个 RAII class 应该提供一个取得其原始资源的方法 对原始资源的访问可能经由显式转换或隐式转换。一般而言显式转换比较安全,但隐式转换对客户比较方便 资源管理类是对抗资源泄露的堡垒。但是由于许多 APIs 会直接使用资源,所以需要一个函数可将 RAII class 对象转换为其内含的原始资源,有两个做法可以达成目标: 显式转换:提供一个成员函数返回原始资源 隐式转换:提供一个隐式转换函数 “operator 原始资源类型()” 使资源管理类型能够隐式转换..

qq_45803411的博客 449

【穿越Effective C++】条款15:在资源管理类中提供对原始资源的访问——封装与兼容性的平衡艺术

这个条款揭示了RAII设计中的一个关键权衡:如何在保持资源安全封装的同时,提供与现有API的兼容性。正确的原始资源访问设计是构建实用资源管理类的关键

沐怡旸的专栏 1021

《Effective C++》学习笔记(条款15:在资源管理类中提供对原始资源的访问)

最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!! 在资源管理类中存储了我们的原始资源,保证了我们的原始资源必定会执行某些操作,但是有时我们需要用到我们的原始资源,所以资源管理类需要提供对原始资源的访问。如条款13中的投资的例子,我们现在需增加一个获得投资天数的接口 int daysHeld(const Investment* pi); //返回某个Investment对象的投资天数 shared_ptr<Investment&

ZLX的博客 301

effective C++学习---条款15:在资源管理类中提供对原始资源的访问

/* *APIs往往要求访问原始资源,所以每一个资源管理类应该提供一个“取得其锁管理的资源”的办法 *对原始资源的访问可能经由显示转或隐式转换,一般而言,显示转换比较安全,但隐式转换客户使用起来 更加方便 */ //显式的,直接返回原始指针 int days = dayHeld(pInv.get()); //隐式的调用 class Investment{ public: bool isTaxF...

chenbiyun940419的博客 224

《Effective C++》学习笔记条款15 在资源管理类中提供对原始资源的访问

在资源管理类中提供对原始资源的访问

UE引擎开发工程师 1565
上一篇: [Effective C++]条款14:在资源管理类中小心coping行为
下一篇: [Effective C++]条款16:成对使用new和delete时要采取相同形式
Tim_10
博客等级 码龄2年 162粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值