C++进阶--RAII 资源获取即初始化
//############################################################################
/* 资源获取即是初始化 (RAII)
*
* 使用对象来管理资源: (利用栈回退时一定会释放栈上对象的机制)
* 内存,硬件设备,网络句柄等
*/
Mutex_t mu = MUTEX_INITIALIZER;
void functionA()
{
Mutex_lock( &mu );
... // 做一系列事情
Mutex_unlock( &mu ); // 是否一定会被执行
}
/*
* 解决方法:
*/
class Lock {
privat:
Mutext_t* m_pm;
public:
explicit Lock(Mutex_t *pm) { Mutex_lock(pm); m_pm = pm;};
~Lock() { Mutex_unlock(m_pm); };
}
void functionA()
{
Lock mylock(&mu);
... // 做一系列事情
} // mutex总是会被释放,当myloack对象从栈上被销毁的时候
/* 结论:
*
* 在异常抛出后唯一保证会被执行的代码是
* 栈上对象的析构函数
*
* 所以资源管理要和合适的对象生命周期结合在一起
* 从而达到自动去分配和回收的目的
*/
/* Note 1:
* 另一个RAII的例子: tr1:shared_ptr
*/
int function_A() {
std::tr1::shared_ptr<dog> pd(new dog());
...
} // 当pd走出作用域时dog会被销毁 (没有指针指向pd).
// Note 2:
// 另一个例子:
class dog;
class Trick;
void train(tr1::shared_ptr<dog> pd, Trick dogtrick);
Trick getTrick();
int main() {
// tr1::shared_ptr<dog> pd(new dog());
train(tr1::shared_ptr<dog> pd(new dog()), getTrick());
}
//问题: 上面代码有什么问题?
// 参数传递的操作顺序由编译器决定
// 如果train()函数的参数传递按如下顺序进行会怎么样:
// 1. new dog();
// 2. getTrick();
// 3. construct tr1::shared_ptr<dog>.
// 第2步如果抛出异常,内存泄漏
// 结论:不要将对象存到共享指针的操作跟其他声明混到一起
/* Note 3:
如果资源的管理对象被拷贝会怎样?
*/
Lock L1(&mu);
Lock L2(L1);
/* Solution 1:
* 禁止拷贝. 见【不让编译器生成类函数】
*/
/* Solution 2:
* 使用tr1::shared_ptr对资源进行引用计数
*/
template<class Other, class D> shared_ptr(Other * ptr, D deleter);
// D的默认值是"delete":
std::tr1::shared_ptr<dog> pd(new dog());
class Lock {
private:
std::tr1::shared_ptr<Mutex_t> pMutex;
public:
explicit Lock(Mutex_t *pm):pMutex(pm, Mutex_unlock) {
Mutex_lock(pm);
// The second parameter of shared_ptr constructor is "deleter" function.
};
}
}
Lock L1(&mu);
Lock L2(L1);
C++进阶--RAII 资源获取即初始化的更多相关文章
- RAII(Resource Acquisition Is Initialization)资源获得式初始化
当在编写代码中用到异常,非常重要的一点是:“如果异常发生,程序占用的资源都被正确地清理了吗?” 大多数情况下不用担心,但是在构造函数里有一个特殊的问题:如果一个对象的构造函数在执行过程中抛出异常,那么 ...
- Java并发包源码学习系列:CLH同步队列及同步资源获取与释放
目录 本篇学习目标 CLH队列的结构 资源获取 入队Node addWaiter(Node mode) 不断尝试Node enq(final Node node) boolean acquireQue ...
- SpringMVC核心——参数获取与Servlet资源获取问题
一.SpringMVC 使用 @PathVariable.@RequestParam.@RequestHeader.@CookieValue 等来解决参数获取问题. 1. @PathVariable: ...
- 关于UI资源获取资源的好的网站
前言:和我一样喜欢UI的一定喜欢这里的内容. 下面是关于sketch资源获取网页,点击图片就能进入: 连接是:https://github.com/JakeLin 居然意外百度到Sketch中国,还提 ...
- js进阶 12-6 如何获取正在发生事件的名字和是哪个元素在发生事件
js进阶 12-6 如何获取正在发生事件的名字和是哪个元素在发生事件 一.总结 一句话总结:event.type 描述事件的类型. event.target 触发该事件的 DOM 元素. ...
- 关于资源获取(请把https改为http)
所有demo以及资源获取,请把https改为http.
- RALL资源获取初始化,删除器
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- [转]抢先Mark!微信公众平台开发进阶篇资源集锦
FROM : http://www.csdn.net/article/2014-08-01/2820986 由CSDN和<程序员>杂志联合主办的 2014年微信开发者大会 将于8月23日在 ...
- Spring进阶教程之在ApplicationContext初始化完成后重定义Bean
前言 很久没有写博客了,也是两个原因:一是自己觉得一直在班门弄斧,其实自己没什么技术可言:二是很多朋友的问题实际上可以自行解决,我经常觉得不该我来过问,或者是有时候我认为技术还得靠自己钻研,我一两句话 ...
随机推荐
- 检测IP地址冲突的shell脚本-check_server_ip_conflict.sh
check_server_ip_conflict.sh 使用arping获取对应IP地址的MAC地址,如果和预料的不一致则报警: #!/bin/bash epg_addr_01="00:50 ...
- 移动Web制作——JD案例
1.制作base.css 2.制作index.html 此时会考虑页面的流式布局 3.制作index.css 总结: 1.页面制作时应注意流式布局,各版本的兼容性. 2.页面的大体组成主要有:轮播图. ...
- xdoj-1010(区间问题)
题目链接 1 扫描一遍不行扫描两遍呗 2 O(n)时间确定cd[i] [max( a[k]-_min) _min是k+1~n的最小值.i<=k<=n] #include <cstd ...
- 51Nod 1240:莫比乌斯函数
1240 莫比乌斯函数 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 莫比乌斯函数,由德国数学家和天文学家莫比乌斯提出.梅滕斯(Mertens)首先使 ...
- 微信导出群记录V3.0
一.序 导出东北师范大学2017级软件工程微信群的聊天记录,形式不限,但需要包含文字.图片和链接,不允许截图. 聊天记录的时间段为2017年11月3日12:00起至2018年1月3日12:00. 二. ...
- 把oracle数据库恢复到某个时间点或者某个scn
alter session set nls_date_format='yyyymmdd hh24:mi:ss'; select sysdate from dual; conn dbauser/1234 ...
- Centos7使用yum安装程序软件时提示未找到安装包解决方法
查找程序软件源,以sshd为例,假设sshd安装包无法找到,那么可以通过以下方法解决 yum provides sshd 然后我们就可以安装*.X86_64的程序软件源 例如yum install o ...
- python基础(七)——网络编程
服务端 我们使用 socket 模块的 socket 函数来创建一个 socket 对象.socket 对象可以通过调用其他函数来设置一个 socket 服务. 现在我们可以通过调用 bind(hos ...
- day 50 Java Script 学习
前端基础之JavaScript JavaScript概述 JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中) ...
- Unity 游戏性能优化 学习
优化误区