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;
参考资料

 

 

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • ajax的跨域请求_js解决跨域问题

    ajax的跨域请求_js解决跨域问题什么是AJAX?AJAX是无需刷新页面就能够从服务器去的数据的一种方法,负责Ajax运作的核心对象是XMLHttpRequest(XHR)对象。同源策略是对XHR的一个主要约束,它为通信设置了“相同的域、相同的端口、相同的协议”这一限制。试图访问上述限制之外的资源都会引发安全错误,除非采用被认可的跨域解决方案。这个方案叫做CORS(Cross-OriginResourceSharing)跨源…

  • 西门子PLC学习笔记二-(工作记录)

    西门子PLC学习笔记二-(工作记录)

  • 什么是索引?Mysql目前主要的几种索引类型「建议收藏」

    什么是索引?Mysql目前主要的几种索引类型「建议收藏」一、索引MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。创建索引时,你需要确保该索引是应用在SQ…

  • java实现发送邮件工具[通俗易懂]

    java实现发送邮件工具[通俗易懂]java实现发送邮件的功能:首先需要导入mail.jar;然后需要写发送方法:1、邮箱发送封装工具类:packagecom.wxjiameng.utils;importjava.util.Date;importjava.util.Properties;importjavax.activation.DataHandler;importjavax.activation.FileDa

  • 报错:“来自数据源的String类型的给定值不能转换为指定目标列的类型nvarchar。”「建议收藏」

    报错:“来自数据源的String类型的给定值不能转换为指定目标列的类型nvarchar。”「建议收藏」解决sqlserver批量插入时出现“来自数据源的String类型的给定值不能转换为指定目标列的类型nvarchar。”问题问题的原因:源的一个字段值长度超过了目标数据库字段的最大长度解决方法:扩大目标数据库对应字段的长度一般原因是源的字段会用空字符串填充,导致字符串长度很大,可以使用rtrim去除…

  • idea上git提交忽略部分目录

    idea上git提交忽略部分目录idea上git提交忽略部分目录

发表回复

您的电子邮箱地址不会被公开。

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