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
前言 很久没有写博客了,也是两个原因:一是自己觉得一直在班门弄斧,其实自己没什么技术可言:二是很多朋友的问题实际上可以自行解决,我经常觉得不该我来过问,或者是有时候我认为技术还得靠自己钻研,我一两句话 ...
随机推荐
- C#线程、前后台线程
C#线程.前后台线程 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享.心创新 ...
- ZOJ5833 Tournament(递归打表)
题目链接:传送门 假思路: 根据题意要求,只能按字典序最小的方法安排比赛. 所以第一场必定是1和2比,3和4比.... 选手:1 2 对手:2 1 根据要求如果1与2比过赛了,1再与其它的人(不妨设为 ...
- lesson5-图像检测-小象cv
R-CNN: 2014,cnn为Alexnet 训练流程: 1)在imagenet上对cnn模型pre-train 2)使用所有ss生成区域对1)进行fine-tune ~softmax改为21维度 ...
- java-冒泡排序、选择排序、二分查找
1.冒泡排序 public void bubbleSort(int[] arr) { for (int i = 0; i < arr.length - 1; i++) { //外循环只需要比较a ...
- Django book manage system
创建一个简易的可以增删改查book的书籍管理system urls.py from django.contrib import admin from django.urls import re_pat ...
- C++学习(十三)(C语言部分)之 练习
打印图像 要用循环 空心或者实心都可以1.矩形 菱形 三角形 梯形 六边形2.打印倒三角形的99乘法表 具体测试代码如下: /* 1.打印图像 要用循环 空心或者实心都可以 矩形 菱形 三角形 梯形 ...
- [Educational Codeforces Round 55 (Rated for Div. 2)][C. Multi-Subject Competition]
https://codeforc.es/contest/1082/problem/C 题目大意:有m个类型,n个人,每个人有一个所属类型k和一个能力v,要求所选的类型的人个数相等并且使v总和最大(n, ...
- mysql 服务器启用event_scheduler
https://blog.csdn.net/yangzefei1991/article/details/51800867 首先在sql中查询计划事件的状态:SHOW VARIABLES LIKE 'e ...
- whmcs语言汉化路径
前台语言访问文件夹/lang,后台语言文件放入/admin/lang
- day11hadoop高可用和Hive
PS:视频一直就是在演示 高可用(比较偏运维一点) PS:Active是对外提供服务的,standBy是从属备用的:但是他们是怎样保证同步的数据的呢?一个运行中zookeeper上的第三方那个工具 ...