WEB开发网
开发学院软件开发C语言 RAII 阅读

RAII

 2009-06-08 08:32:23 来源:WEB开发网   
核心提示:对于资源,这里我分为两类:1. 内存资源2. 非内存资源(文件、网络资源等)C++ 对于内存资源的管理部分是自动的:栈上的内存资源将被自动释放,RAII,堆上的内存资源需要程序员自己释放,手动管理内存资源,他也不能保证永远正确的释放了内存资源,遇见上面情况的解决办法之一就是使用 autoptr,总会让我们在一些极端情况

对于资源,这里我分为两类:

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&) {       
        // 无需释放资源   
    }   
    // 没有异常继续处理
}

1 2 3 4 5  下一页

Tags:RAII

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接