您的位置:首页 > 大数据 > 人工智能

RAII(资源创建即释放)

2016-05-31 22:44 459 查看
RAII是一种技术,利用了C++局部对象在跳出作用域时执行析构函数的机制,将一些资源的释放安排在析构函数中,保证安全的使用资源。

举个例子:

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);//加锁

}//退出作用域时解锁
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  class c语言