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


相关推荐

  • dll文件注册器_VS语言

    dll文件注册器_VS语言点击  开始\所有程序\MicrosoftVisualStudio2008\VisualStudioTools 以管理员身份运行VisualStudio2008CommandPrompt。//注册Dll在VisualStudio2008CommandPrompt键入E:\>regasmmydll.dll.eg:E:\>regasmE:\Assig

    2022年10月11日
    5
  • 芭芭农场自动脚本_农场游戏源码

    芭芭农场自动脚本_农场游戏源码特此声明:此版本校内开心农场外挂由python语言编写,运行平台为linux。本代码是修改网络上流传的源码而成,本人贴出此代码没有任何利益想法,只当学习交流之用,并感谢源码开发者!#!/usr/bin/envpython#encoding:utf-8#2009-8-21升级后importurllib,urllib2,cookielibimporttime,zlib,r

    2025年11月3日
    5
  • tlb存的什么_TLB原理

    tlb存的什么_TLB原理TLB 是 translationl 的简称 首先 我们知道 MMU 的作用是把虚拟地址转换成物理地址 虚拟地址和物理地址的映射关系存储在页表中 而现在页表又是分级的 64 位系统一般都是 3 5 级 常见的配置是 4 级页表 就以 4 级页表为例说明 分别是 PGD PUD PMD PTE 四级页表 在硬件上会有一个叫做页表基地址寄存器 它存储 PGD 页表的首地址 MMU 就是根据页表基地址寄存

    2026年3月19日
    2
  • 金税盘计算机USB无法识别,金税盘无法识别怎么办

    金税盘计算机USB无法识别,金税盘无法识别怎么办摘要:这篇文章将给财务会计人员讲解金税盘无法识别怎么办相关的内容,在金税盘无法识别怎么办这篇财务资讯中我们详细讲解了有关金税盘无法识别怎么办的会计知识。金税盘无法识别怎么办部分情况可能是因为USB供电不稳定,造成金税盘驱动无法正常运行;建议电脑重启,金税盘数据线重新插拔一下或者更换一个USB端口连接试试.如果多次尝试无效,则需要联系服务单位处理.金税盘使用增值税防伪税控系统,可开具增值税专用发票和…

    2022年6月11日
    178
  • jquery智能弹出层,自己主动推断位置

    jquery智能弹出层,自己主动推断位置

    2022年2月7日
    104
  • RequestParam注解用法[通俗易懂]

    RequestParam注解用法[通俗易懂]最简单的两种写法,在写接口时:加或不加@RequestParam注解的区别第一种写法参数为非必传,第二种写法参数为必传。参数名为userId第二种写法可以通过@RequestParam(required=false)设置为非必传。因为required值默认是true,所以默认必传第二种写法可以通过@RequestParam(“userId”)或者@RequestParam(value=“userId”)指定参数名第二种写法可以通过@RequestParam(defaultValue=“

    2025年8月6日
    4

发表回复

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

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