RAII
2009-06-08 08:32:23 来源:WEB开发网对于资源,这里我分为两类:
1. 内存资源
2. 非内存资源(文件、网络资源等)
C++ 对于内存资源的管理部分是自动的:栈上的内存资源将被自动释放,堆上的内存资源需要程序员自己释放。
手动管理内存资源,总会让我们在一些极端情况下犯错。一个最简单,最常见的例子如下:
void f()
{
A* a = new A();
B* b = new B();
C* c = new C();
// ...
if (某种条件)
{
// 失败时
delete a;
delete b;
delete c;
// ...
return;
}
// 成功继续处理
Z* z = new Z();
try
{
f2(); // f2 可能抛出异常
} catch (const xxx&) {
delete a;
delete b;
delete c;
// 忘记释放 z
}
// 没有异常继续处理
}
不论是多么优秀的程序员,他也不能保证永远正确的释放了内存资源,遇见上面情况的解决办法之一就是使用 autoptr,我们可以这样写:
void f()
{
autoptr<A> a(new A());
autoptr<B> b(new B());
autoptr<C> c(new C());
// ...
if (某种条件)
{
// 失败时,无需释放资源
return;
}
// 成功继续处理
autoptr<Z> z(new Z());
try
{
f2(); // f2 可能抛出异常
} catch (const xxx&) {
// 无需释放资源
}
// 没有异常继续处理
}
- ››RAII
赞助商链接