RAII_ras raf

RAII_ras rafhttp://baike.baidu.com/link?url=DUGlzCMqyZ2aInTkdpGWqW0f53fL-LWLu9nD3rGoJClIUb8rssh8oCALOhad7MDAWkqEhdfUzPU72jvQeDx5KK目录1RAII简介2RAII的分类3RAII实际应用4RAII与STL容器1RAII简介RAII[1]

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

http://baike.baidu.com/link?url=DUGlzCMqyZ2aInTkdpGWqW0f53fL-LWLu9nD3rGoJClIUb8rssh8oCALOhad7MDAWkqEhdfUzPU72jvQeDx5KK

目 录

1RAII简介

2RAII的分类

3RAII实际应用

4RAII与STL容器

1RAII简介

RAII
[1]
(Resource Acquisition Is Initialization),也成为“资源获取就是初始化”,是C++语言的一种管理资源、避免泄漏的惯用法。C++标准保证任何情况下,已构造的对象最终会销毁,即它的析构函数最终会被调用。简单的说,RAII 的做法是使用一个对象,在其构造时获取资源,在对象生命期控制对资源的访问使之始终保持有效,最后在对象析构的时候释放资源。

2RAII的分类

根据RAII
[2]
对资源的所有权可分为常性类型和变性类型,代表者分别是boost:shared_ptr<>[2]和std::auto_ptr<>;从所管资源的初始化位置上可分为外部初始化类型和内部初始化类型。
常性类型是指获取资源的地点是构造函数,释放点是析构函数,并且在这两点之间的一段时间里,任何对该RAII类型实例的操纵都不应该从它手里夺走资源的所有权。变性类型是指可以中途被设置为接管另一个资源,或者干脆被置为不拥有任何资源。外部初始化类型是指资源在外部被创建,并被传给RAII实例的构造函数,后者进而接管了其所有权。boost:shared_ptr<>和std::auto_ptr<>都是此类型。与之相对的是内部初始化类型。
其中,常性且内部初始化的类型是最为纯粹的RAII形式,最容易理解,最容易编码。

3RAII实际应用

每当处理需要配对的获取/释放函数调用的资源时,都应该将资源封装在一个对象中,实现自动资源释放。例如,我们无需直接调用一对非成员函数OpenPort/ClosePort,而是可以考虑定义常性且内部初始化的RAII概念的“端口”操作类:
class Port{
public:
Port(const string& destination);//调用OpenPort
~Port();//调用ClosePort
};
void DoSomething(){
Port port1(“server1:80”);
}
shared_ptr<Port> post2 = /*…*/; //port2在最后一个引用它的
//shared_ptr离开作用域后关闭
通过使用上述RAII类型,可以避免程序员忘记关闭端口而引起的泄漏,还可以确保异常发生时栈展开过程中自动释放端口资源。

4RAII与STL容器

STL容器是基于值语义的,在容器内部,对象是常被复制的。如果RAII类型需要存入STL容器,需要作一些处理。
class Resource
{
public:
Resource() {/*分配资源*/}
~ Resource() {/*释放资源*/}
private:
int handle;
};
std::map< Identifier, Resource > resourceMap;
以上代码中STL容器对Resource的复制将导致运行期错误。最好的方法是让RAII类型继承于boost::noncopyable[2],而后在容器中使用引用计数的指针:
class Resource : public boost::noncopyable
{
public:
Resource() {/*分配资源*/}
~ Resource() {/*释放资源*/}
private:
int handle;
};
typedef boost::shared_ptr<Resource> PointerToResourceType;
typedef std::map< Identifier, PointerToResourceType> ResourceMapType;
ResourceMapType resourceMap;
作为替代,还可以使用非拷贝行为的容器:boost::ptr_map<Identifier,Resource> map;
参考资料

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/204012.html原文链接:https://javaforall.net

(0)
上一篇 2025年8月8日 下午8:43
下一篇 2025年8月8日 下午9:22


相关推荐

  • Java面试宝典(2019版)

    Java面试宝典(2019版)附Java/C/C++/机器学习/算法与数据结构/前端/安卓/Python/程序员必读书籍书单大全:书单导航页(点击右侧极客侠栈即可打开个人博客):极客侠栈①【Java】学习之路吐血整理技术书从入门到进阶最全50+本(珍藏版)②【算法数据结构+acm】从入门到进阶吐血整理书单50+本(珍藏版)③【数据库】从入门到进阶必读18本技术书籍网盘吐血整理网盘(珍藏版)④【Web前端】从HT…

    2022年7月14日
    16
  • java rpm卸载_使用RPM卸载软件「建议收藏」

    java rpm卸载_使用RPM卸载软件「建议收藏」rpm-e做了什么rpm-e(等同于rpm–erase)这个命令能够卸载或擦除一个或多个安装包,当RPM卸载一个RPM包时,做了以下几件事:确保数据库中没有其它包引用了要卸载的包。执行卸载前的脚本(如果有的话)检查配置文件是否已经被修改过,如果是,则保留它们的一个备份。查询数据库,找到这个包安装的所有文件,如果该些文件不属于别的包,则将它们删除。执行卸载后的脚本(如果有的话)从数据库中…

    2026年2月19日
    4
  • 算数平均数与几何平均数

    算数平均数与几何平均数算数平均数与几何平均数文章目录算数平均数与几何平均数一 算数平均数二 几何平均数 1 定义 2 几何意义三 二者关系一 算数平均数算数平均数分为简单算数平均数与加权算术平均数 简单算术平均 主要用于未分组的原始数据 设一组数据为 x1x 1×1 x2x 2×2 x3x 3×3 xkx kxk 得到简单算数平均 M x1 x2 x3 xkkM frac x 1 x 2 x 3 x k k M kx1 x2 x3 xk 加权算术平均 主要用于处理经分组整理的

    2026年3月19日
    2
  • 红米游戏手机防水吗?ip53防水等级什么概念?

    红米游戏手机防水吗?ip53防水等级什么概念?我们在玩游戏的时候经常会旁边放水或者饮料 不小心碰到撒到手机很容易引起故障 即将上市的红米游戏手机大家都非常关注 由于之前小米 11ultra 融入了高透泄压阀防水技术大家都非常认可 所以网友问这款红米游戏手机有没有防水功能 它支持几级防水 红米游戏手机有防水功能吗支持 IP53 级别防尘防水 具有一定的防尘防水效果 但在使用时还是要注意避开水 油等液体 以免进入手机 IP53 等级防水性能 5 防护灰尘 不可能完全阻止灰尘进入 但灰尘进入的数量不会影响设备的正常运行 3 防护溅出的水 以 60 度角从垂直线两

    2026年3月17日
    2
  • 外汇交易平台怎么选,安全正规的外汇平台怎么选不了_比较靠谱的外汇平台有哪些

    外汇交易平台怎么选,安全正规的外汇平台怎么选不了_比较靠谱的外汇平台有哪些外汇交易平台怎么选,安全正规的外汇平台怎么选虽然这两年外汇市场一直火爆发展,但也催生了很多黑平台,给投资者在选择外汇交易平台时带来了很多风险和困难,对于投资者来说,进入外汇市场前期除了掌握必要的基础知识,最重要的就是选择一个安全可靠的平台。业内分析师提示广大投资者:在国内,外汇保证金交易目前暂时没有官方的金融监管机构和机制,炒外汇时一定要选择尽量国际外汇交易平台,而要判断一…

    2025年10月22日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号