RAII in C++】的更多相关文章

https://www.hackcraft.net/raii/ https://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization…
原文链接:http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Resource_Acquisition_Is_Initialization Intent To guarantee release of resource(s) at the end of a scope To provide basic exception safety guarantee Also Known As Execute-Around Object Resource Rel…
////一个简单的防止内存泄露的例子//void test() { //使用RAII的特性管理资源 //当智能指针unique_ptr被销毁时,它指向的对象也将被销毁 //这里test函数返回后 p将自动销毁 //unique_ptr<int[]> p( new int[200] ); //直接生成资源 //test函数返回后 p不能被正常销毁,就会造成资源泄露 //int* p = new int[200]; } int main() { ) { test(); Sleep( ); } ;…
[1]什么是RAII惯用法? RAII是Resource Acquisition Is Initialization的缩写,意为“资源获取即初始化”. 它是C++之父Bjarne Stroustrup提出的设计理念,其核心是把资源和对象的生命周期绑定,对象创建获取资源,对象销毁释放资源. 软件开发中,会用到各种各样的资源.狭义的资源指内存,而广义的资源包括文件.网络连接.数据库连接.信号量.事件.线程.内存等,甚至可以是状态. 资源获取后由于种种原因导致永久不能释放的资源称为资源泄漏. 针对资源…
http://www.jellythink.com/archives/101 前言 在写C++设计模式——单例模式的时候,在写到实例销毁时,设计的GC类是很巧妙的,而这一巧妙的设计就是根据当对象的生命周期结束时会自动调用其析构函数的,而这一巧妙的设计也是有专业的名词的——RAII.那以下将围绕RAII,全面的讲解RAII的相关知识. 什么是RAII? RAII是Resource Acquisition Is Initialization的简称,是C++语言的一种管理资源.避免泄漏的惯用法.利用的…
[说明]这篇文章本来发布在我个人网站的博客上,但由于:1,打算以cnblogs为家了:2. 关于智能指针部分需要修订,所有将修订版发在这里,作为第一篇文章. 常遇到的动态内存回收问题 在C++的编程过程中,我们经常需要申请一块动态内存,然后当用完以后将其释放.通常而言,我们的代码是这样的: 1: void func() 2: { 3: //allocate a dynamic memory 4: int *ptr = new int; 5:  6: //use ptr 7:  8: //rele…
RAII被认为是c++资源管理的最佳范式,但是c++98中用RAII必须为要管理的资源写一个类,这样一来RAII的使用就有些繁琐了.C++11有了lambda和function后,我们就可以编写泛化的RAII,实现ScopeGuard,优雅地解决这个问题.本文主要参考刘未鹏的博客. 主要代码如下 class ScopeGuard { public: explicit ScopeGuard(std::function<void()> onExitScope) : onExitScope_(onE…
C/C++的资源是手动管理的 这导致程序员在申请资源时,最后用完了偶尔会忘记回收 C++语言的发明者倡导RAII,资源获取即初始化 使用对象来管理资源的生命周期,在超出作用域时,析构函数自动释放资源 然而,很多程序员不愿意每次使用一个资源,就生成一个class类型来管理资源 C++ 11的来临,可以很优雅的解决这个麻烦 用到std function和lambda闭包 class ScopeGuard { public: explicit ScopeGuard(std::function<void…
RAII:(Resource Acquisition Is Initialization),也就是“资源获取就是初始化”,是C++语言的一种管理资源.避免泄漏的惯用法.C++标准保证任何情况下,已构造的对象最终会销毁,即它的析构函数最终会被调用.简单的说,RAII 的做法是使用一个对象,在其构造时获取资源,在对象生命期控制对资源的访问使之始终保持有效,最后在对象析构的时候释放资源. RAII分类: 根据RAII对资源的所有权可分为常性类型和变性类型,代表者分别是boost:shared_ptr<…
当在编写代码中用到异常,非常重要的一点是:“如果异常发生,程序占用的资源都被正确地清理了吗?” 大多数情况下不用担心,但是在构造函数里有一个特殊的问题:如果一个对象的构造函数在执行过程中抛出异常,那么这个对象的析构函数就不会被调用. 困难的事情是在构造函数中分配资源.如果在构造函数中发生异常,析构函数将没有机会释放这些资源. 这个问题经常伴随着”悬挂“指针出现. 例如: // Naked pointers. #include <iostream> #include <cstddef>…
本文主要站在C++程序员的思维角度思量. functional之路 lambda表达式 lambda表达式,是一段代码片段.函数实现体中出现的可重用的代码块. 在C++之前,C语言最小可复用流程模块,是函数:只有函数是用以处理不同类型数据的代码块,书写一次可多次被调用以重复利用优化设计,减少工程复杂度. C++出来之后,并没有立即改进函数设计的代码技术,而是首先由boost第三方库锻造出来的lambda支持来强化设计工作,使得在函数代码中也可以进一部优化复用代码,进一步得到简洁描述. 由后来C+…
在C++的编程过程中,我们经常需要申请一块动态内存,然后当用完以后将其释放.通常而言,我们的代码是这样的: 1: void func() 2: { 3: //allocate a dynamic memory 4: int *ptr = new int; 5: 6: //use ptr 7: 8: //release allocated memory 9: delete ptr; 10: ptr = NULL; 11: } 如果这个函数func()逻辑比较简单,问题不大,但是当中间的代码有可能抛…
Resource Acquisition Is Initialization or RAII, is a C++ programming technique which binds the life cycle of a resource (allocated memory, thread of execution, open socket, open file, locked mutex, database connection-anything that exists in limited…
当使用 std::thread 对象执行线程时,必须要调用 join() (或者 detach(),由于 detach() 可以立即调用,所以这里只考虑 join()) #include <iostream> #include <thread> #include <chrono> using namespace std; void threadInvoker() { cout << "thread begin\n"; this_threa…
C++作为一门Native Langueages,在C++98/03时代,资源管理是个大问题.而内存管理又是其中最大的问题.申请的堆内存需要手动分配和释放,为了确保内存正确释放,一般原则是"谁分配谁负责释放",但软件工程的复杂性.程序员的编码水平参差不齐等仍然导致内存泄漏.空悬指针等问题.严重的内存泄漏可能很快导致服务器内存耗光而运行崩溃. 托管语言(JAVA.C#.C++ CLI等)为了解决这种问题引入了GC,把内存管理交给机器处理.而C++的解决办法一个是重启程序(内存泄漏严重时)…
//############################################################################ /* 资源获取即是初始化 (RAII) * * 使用对象来管理资源: (利用栈回退时一定会释放栈上对象的机制) * 内存,硬件设备,网络句柄等 */ Mutex_t mu = MUTEX_INITIALIZER; void functionA() { Mutex_lock( &mu ); ... // 做一系列事情 Mutex_unlock…
RAII(Resource Acquisition Is Initialization),也称为“资源获取就是初始化”,是C++语言的一种管理资源.避免泄漏的惯用法.C++标准保证任何情况下,已构造的对象最终会销毁,即它的析构函数最终会被调用.简单的说,RAII 的做法是使用一个对象,在其构造时获取资源,在对象生命期控制对资源的访问使之始终保持有效,最后在对象析构的时候释放资源. 详见:http://developer.51cto.com/art/201106/267946.htm…
转载:http://www.jellythink.com/archives/101 什么是RAII? RAII是Resource Acquisition Is Initialization的简称,是C++语言的一种管理资源.避免泄漏的惯用法.利用的就是C++构造的对象最终会被销毁的原则.RAII的做法是使用一个对象,在其构造时获取对应的资源,在对象生命期内控制对资源的访问,使之始终保持有效,最后在对象析构的时候,释放构造时获取的资源. RAII的本质内容是用对象代表资源,把管理资源的任务转化为管…
摘要 RAII技术被认为是C++中管理资源的最佳方法,进一步引申,使用RAII技术也可以实现安全.简洁的状态管理,编写出优雅的异常安全的代码. 资源管理 RAII是C++的发明者Bjarne Stroustrup提出的概念,RAII全称是“Resource Acquisition is Initialization”,直译过来是“资源获取即初始化”,也就是说在构造函数中申请分配资源,在析构函数中释放资源.因为C++的语言机制保证了,当一个对象创建的时候,自动调用构造函数,当对象超出作用域的时候会…
baidu百科 RAII 百科名片 RAII,也称为“资源获取就是初始化”,是c++等编程语言常用的管理资源.避免内存泄露的方法.它保证在任何情况下,使用对象时先构造对象,最后析构对象. 目录 RAII简介 RAII的分类 RAII实际应用 RAII与STL容器 编辑本段RAII简介 RAII[1](Resource Acquisition Is Initialization),也成为“资源获取就是初始化”,是C++语言的一种管理资源.避免泄漏的惯用法.C++标准保证任何情况下,已构造的对象最终…
一.对象语义与值语义 1.值语义是指对象的拷贝与原对象无关.拷贝之后就与原对象脱离关系,彼此独立互不影响(深拷贝).比如说int,C++中的内置类型都是值语义,前面学过的三个标准库类型string,vector,map也是值语义 2.对象语义指的是面向对象意义下的对象 对象拷贝是禁止的(Noncopyable) OR 一个对象被系统标准的复制方式复制后,与被复制的对象之间依然共享底层资源,对任何一个的改变都将改变另一个(浅拷贝) 3.值语义对象生命期容易控制 4.对象语义对象生命期不容易控制(通…
RAII,它是“Resource Acquisition Is Initialization”的首字母缩写.也称为“资源获取就是初始化”,是c++等编程语言常用的管理资源.避免内存泄露的方法.它保证在任何情况下,使用对象时先构造对象,最后析构对象. RAII的好处在于它提供了一种资源自动管理的方式,当产生异常.回滚等现象时,RAII可以正确地释放掉资源. 当讲述C++资源管理时,Bjarne这样写道: 使用局部对象管理资源的技术通常称为“资源获取就是初始化”.这种通用技术依赖于构造函数和析构函数…
在C++中,如果对一个块直接分配资源,而且在释放资源之前发生异常,那么这些资源在栈展开(注1)期间将不会得到释放.例如,一个块可以通过调用new动态分配内存,如果该块因异常退出,编译器将不会删除该指针,已分配的内存也不会得到释放. 比如下面这个函数: void funtion() { vector<string> str_vec; string s; while(cin >> s) v.push_back(s); string *p = new string[v.size()];…
参考文章https://blog.csdn.net/pongba/article/details/7911997 什么是RAII 技术?(参见百度百科相关条目) RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内存.文件句柄.网络连接.互斥量等等)的简单技术.  RAII 的一般做法是这样的:在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源.借此,我们实际上把…
RAII:在构造函数中申请资源,在析构函数中释放资源. 1. RAII 自动实现锁资源的释放 void bad() { m.lock(); f(); if (COND) return; m.unlock(); } 显然如果提前返回,会导致死锁. class SafeMutex { public: SafeMutex(std::mutex& m) : _m(m) { m.lock(); } ~SafeMutex() { _m.unlock(); } private: std::mutex&…
转自https://blog.csdn.net/wangshubo1989/article/details/52133213 有很多东西我们一直在用,但是不知道他的名字. 什么是RAII? RAII是Resource Acquisition Is Initialization的缩写,用普通话将就是”资源获取即初始化” 为什么需要RAII? 看一段代码: RawResourceHandle* handle=createNewResource(); handle->performInvalidOpe…
我们不止一次写过这种代码: { mutex_.lock(); //XXX if(....) return; //XXX mutex_.unlock(); } 显然,这段代码中我们忘记了解锁.那么如何防止这种情况,我们采用和智能指针相同的策略,把加锁和解锁的过程封装在一个对象中. 实现"对象生命期"等于"加锁周期". 代码如下: class MutexLockGuard : NonCopyable { public: MutexLockGuard(MutexLock…
CriticalSectionWrapper是一个接口类 class CriticalSectionWrapper { public: // Factory method, constructor disabled static CriticalSectionWrapper* CreateCriticalSection(); virtual ~CriticalSectionWrapper() {} // Tries to grab lock, beginning of a critical se…
http://blog.csdn.net/hunter8777/article/details/6327704 C++中的RAII全称是“Resource acquisition is initialization”,直译为“资源获取就是初始化”.但是这翻译并没有显示出这个惯用法的真正内涵.RAII的好处在于它提供了一种资源自动管理的方式,当产生异常.回滚等现象时,RAII可以正确地释放掉资源. 举个常见的例子: void Func() { FILE *fp; char* filename = …
RAII手法是 Resource Acquisition is Initialization 的缩写,意为“资源获取即初始化”,在使用智能指针时也使用,下面是针对互斥量时的实现, #include <iostream> #include <pthread.h> using namespace std; class MutexLock { public: MutexLock() { pthread_mutex_init(&mutex_, NULL); } ~MutexLock…