RAII(资源创建即释放)
2016-05-31 22:44
459 查看
RAII是一种技术,利用了C++局部对象在跳出作用域时执行析构函数的机制,将一些资源的释放安排在析构函数中,保证安全的使用资源。
举个例子:
看看RAII如何解决这种情况。
RAII的应用场景很多,boost用于线程同步的互斥量Mutex也使用了此机制。
boost::mutex m_objMutex;
{
boost::mutex::scoped_lock lock(m_objMutex);//加锁
}//退出作用域时解锁
举个例子:
A.h class A { public: A(int size); virtual ~A(); public: void SetMem(int size, char value); private: int* m_ptrValue; } A.cpp A::A(int size) { m_ptrValue = (int*)malloc(size); assert(m_ptrValue == NULL); } A::~A() { } void A::SetMem(int size, char value) { memset(m_ptrValue,value,size); } main.cpp #include "A.h" int main() { A a(100); [ try { do something error! } catch() { //比如抛出了某个异常,并且被捕获。这个异常不是致命的,程序的其它逻辑仍可以继续运行。但是由于其分配的空间没有被释放将会导致越积越多,最终导致内存耗尽而导致整个程序甚至机器崩溃。除非在每一个捕获异常的地方进行手工delete释放。 } ] }
看看RAII如何解决这种情况。
A.h class A { public: A(int size); virtual ~A(); public: void SetMem(int size, char value); private: int* m_ptrValue; } A.cpp A::A(int size) { m_ptrValue = (int*)malloc(size); assert(m_ptrValue == NULL); } A::~A() { delete m_ptrValue; } void A::SetMem(int size, char value) { memset(m_ptrValue,value,size); } main.cpp #include "A.h" int main() { A a(100); [ try { [ //某段逻辑抛出异常 ] } catch() { [ //捕获并返回,return之后a对象自动调用析构函数将已分配的内存释放,此时无论出现多少次异常,都不会出现内存耗尽的情况。 ] } ] }
RAII的应用场景很多,boost用于线程同步的互斥量Mutex也使用了此机制。
boost::mutex m_objMutex;
{
boost::mutex::scoped_lock lock(m_objMutex);//加锁
}//退出作用域时解锁
相关文章推荐
- Android Native 绘图方法
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- C#中struct和class的区别详解
- Lua和C语言的交互详解
- VBS ArrayList Class vbs中的数组类
- 大家看了就明白了css样式中类class与标识id选择符的区别小结
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- C语言练习题:自由落体的小球简单实例
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中进制知识汇总