• C++异常(exception)第三篇-------如何释放资源(没有finally语句)


    问题:

    C++中没有finally,那么应该在哪里关闭资源?

    C++的try{}catch(){},为什么没有finally{}块来释放资源?
    如类中的一个方法,局部变量
    File * file=NULL;
    Try{
    file=fopen(“aaa.txt”,”r”);
    然后执行一些操作。
    }
    最后fclose(file);
    假如,file操作时发生异常,需要关闭。对于Java来说,是在finally{}块中关闭。不论是否发生异常,一定会关闭!
    而C++中呢,怎样保证一定关闭这个文件呢?



    分析:


    1  使用一个类的对象而不是指针

    在C++中通常使用RAII,即Resource Aquisition Is Initialization.
    就是将资源封装成一个类,将资源的初始化封装在构造函数里,释放封装在析构函数里。要在局部使用资源的时候,就实例化一个local object。
    在抛出异常的时候,由于local object脱离了作用域,自动调用析构函数,会保证资源被释放

    //其实就是“栈展开”,就是在“弹栈”时候自动将栈中构造好的对象析构,这样就可以保证没有“资源泄漏”了。

    简单的例子:
    try {
       File f("xxx.ttt");
        //other file operation
    }//File pointer is released here
    catch {
        //exception process
    }


    2 封装在一个类中

    楼主只要将这个对象指针“File * file”封装到另外一个对象中就可以了,如:
    class foo{
    public:
         File *file;
         foo() { //初始化file }
         ~foo() { //释放资源 }
    };

    这样不就可以了。


    2 智能指针 把原来的对象指针包起来


    try
    {
        std::auto_ptr<file> pfile = new file();
        //....
    }
    catch(...)
    {
        //....
    }

    都不用写delete了


    总结自;http://bbs.csdn.net/topics/90070457


  • 相关阅读:
    团队项目----数据库SQL语句学习总结与实践
    团队项目----德州扑克数据库设计之改进版
    期末项目《员工考勤管理系统》
    Applet
    Json
    study of javaserver faces lifecycle
    Session
    xml的用途,定义,原理,以及前景
    互联网应用于企业级应用的区别
    JavaEE体系架构
  • 原文地址:https://www.cnblogs.com/catkins/p/5270608.html
Copyright © 2020-2023  润新知