//############################################################################
/* 资源获取即是初始化 (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 资源获取即初始化的更多相关文章

  1. RAII(Resource Acquisition Is Initialization)资源获得式初始化

    当在编写代码中用到异常,非常重要的一点是:“如果异常发生,程序占用的资源都被正确地清理了吗?” 大多数情况下不用担心,但是在构造函数里有一个特殊的问题:如果一个对象的构造函数在执行过程中抛出异常,那么 ...

  2. Java并发包源码学习系列:CLH同步队列及同步资源获取与释放

    目录 本篇学习目标 CLH队列的结构 资源获取 入队Node addWaiter(Node mode) 不断尝试Node enq(final Node node) boolean acquireQue ...

  3. SpringMVC核心——参数获取与Servlet资源获取问题

    一.SpringMVC 使用 @PathVariable.@RequestParam.@RequestHeader.@CookieValue 等来解决参数获取问题. 1. @PathVariable: ...

  4. 关于UI资源获取资源的好的网站

    前言:和我一样喜欢UI的一定喜欢这里的内容. 下面是关于sketch资源获取网页,点击图片就能进入: 连接是:https://github.com/JakeLin 居然意外百度到Sketch中国,还提 ...

  5. js进阶 12-6 如何获取正在发生事件的名字和是哪个元素在发生事件

    js进阶 12-6 如何获取正在发生事件的名字和是哪个元素在发生事件 一.总结 一句话总结:event.type 描述事件的类型.        event.target 触发该事件的 DOM 元素. ...

  6. 关于资源获取(请把https改为http)

    所有demo以及资源获取,请把https改为http.

  7. RALL资源获取初始化,删除器

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  8. [转]抢先Mark!微信公众平台开发进阶篇资源集锦

    FROM : http://www.csdn.net/article/2014-08-01/2820986 由CSDN和<程序员>杂志联合主办的 2014年微信开发者大会 将于8月23日在 ...

  9. Spring进阶教程之在ApplicationContext初始化完成后重定义Bean

    前言 很久没有写博客了,也是两个原因:一是自己觉得一直在班门弄斧,其实自己没什么技术可言:二是很多朋友的问题实际上可以自行解决,我经常觉得不该我来过问,或者是有时候我认为技术还得靠自己钻研,我一两句话 ...

随机推荐

  1. 使用libcurl作为Http client

    产品通过HTTP协议为外部提供接口服务,常规情况是客户通过HTTP协议请求服务,服务结束后通过HTTP协议将服务记录POST到请求方. 用原生C实现了一个简单的HTTP Client,只有简单的功能: ...

  2. SFM(structure from motion)学习记录(一)

    visualSFM用法 添加图片 "File->Open Multi Images". 一次添加多幅图片 "SfM->Load NView Match&quo ...

  3. 用纯JS实现,点击一个列表时,输出对应的索引(不能用JQuery哦)

    你运行一下代码会发现,无论你点击哪个列表,控制台都是输出10.这是因为var声明的变量是函数作用域的,而不是块级作用域的.也就是说,for循环10次,每次都是改变同一个i,所以它的值会从0一直加到10 ...

  4. MyBatis #{} 取值注意事项

    正确写法#{key} 错误写法#{key } #{}中不能加空格,不然会报错

  5. 【转】基于Map的简易记忆化缓存

    看到文章后,自己也想写一些关于这个方面的,但是觉得写的估计没有那位博主好,而且又会用到里面的许多东西,所以干脆转载.但是会在文章末尾写上自己的学习的的东西. 原文出处如下: http://www.cn ...

  6. Go Example--通道同步

    package main import ( "fmt" "time" ) func main() { //缓存通道 done := make(chan bool ...

  7. SolrCore Initialization Failures - Max direct memory is likely too low

    org.apache.solr.common.SolrException:org.apache.solr.common.SolrException: The max direct memory is ...

  8. sqler sql 转rest api javascript 试用

    sqler 内嵌了一个js 引擎的实现(基于goja,当我们配置了exec的配置之后 调用宏(redis 接口)或者rest api 的时候会有一个全局变量$result ,保存了执行的结果,我们可以 ...

  9. L老师 Shader编程教程 学习

    Shader "VoidGame/FixedShader" { Properties{ //颜色 _Color("Color",Color)=(1,1,1,1) ...

  10. oracle-rman-2

    归档日志的备份 RMAN> list archivelog all;show archivelog deletion policy;configure archivelog deletion p ...