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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • discuz搬家。

    discuz搬家。discuz转移时要记得数据库名也要修改。。。。。 discuz搬家时confing文件夹4个文件数据库连接都要改对应4处。/bbs/config/config_global.php、config_global_default.php、config_ucenter.php、config_ucenter_default.php而且有一个文件要改5处。即:config_ucenter.ph

    2022年7月17日
    12
  • 论文摘抄 – FlumeJava[通俗易懂]

    论文摘抄 – FlumeJava

    2022年2月1日
    40
  • 常见的基本汇编书籍有哪些_简单点的汇编书籍

    常见的基本汇编书籍有哪些_简单点的汇编书籍Windows.环境下32位汇编语言程序设计(第2版) http://www.happycampus.cn/docs/957100583237@hc10/275980/ 汇编语言编程艺术 Intel汇编语言程序设计(第四版) Intel汇编语言程序设计(第五版)范例 http://download.csdn.net/source/1523425 

    2022年10月13日
    3
  • Windows 7 资源管理器搜索Channel 9 视频[通俗易懂]

    Windows 7 资源管理器搜索Channel 9 视频[通俗易懂]在Windows7中FederatedSearch可以通过OpenSearch协议访问到远程数据资源,也就意味着用户可以使用资源管理器(WindowsExplorer)搜索并浏览远程数据。本篇我们将制作一个搜索连接器(SearchConnector)查找Channel9上的视频资料。FederatedSearch工作原理下图描绘了Fed…

    2022年7月13日
    25
  • vue引入echarts报错解决

    vue引入echarts报错解决在 Vue 项目中引入 Echart 使用 npminstall 指令 的时候报错 PSG gt npminstallnp lock jsonfilewasc npmWARNoldlo n

    2025年7月14日
    3
  • IP代理池的使用

    IP代理池的使用参考书籍:python3网络爬虫开发与实战作者个人博客:https://cuiqingcai.com/下载IP代理池的程序,其作者放在了GitHub:https://github.com/Python3WebSpider/ProxyPool需要的工具:pycharm、各种库、python37、redis安装、redis可视化工具(在参考书籍作者博客中都有安装方法)1、下载IP…

    2022年5月9日
    64

发表回复

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

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