• 资源获取即初始化RAII


    //class Resource {
    //public:
    //    Resource(parms p): r(allocate(p)) { }
    //    ~Resource() { release(r); }
    //    // also need to define copy and assignment
    //private:
    //    resource_type *r;           // resource managed by this type
    //    resource_type *allocate(parms p);     // allocate this resource
    //    void release(resource_type*);         // free this resource
    //};
    
    //void fcn()
    //{
    //    Resource res(args);   // allocates resource_type
    //    // code that might throw an exception
    //    // if exception occurs, destructor for res is run automatically
    //    // ...
    //}  // res goes out of scope and is destroyed automatically
    
    #include <exception>
    #include <iostream>
    #include <unistd.h>
    #include <stdexcept>
    
    class Resource {
    public:
        // 不用allocate这个函数时,可以使用这个构造函数也是一样的
        //Resource(int const & number) : r(new int [number]())
        //{ 
        //    std::cout << "allocate 4k bytes" << std::endl;
        //}
        Resource(int const & number) : r(allocate(number)) { }
        ~Resource() { release(r); }
    private:
        // I as a programmer, believe this function may throw exception
        int* allocate(const int & number) const
        {
            std::cout << "allocate 4k bytes " << std::endl;
            return new int[number]();           // 小括号表示初始化为0,在linux下这句话也是编不过的,必须把小括号拿掉
        }
        // I as a programmer, believe that this function will not throw exception
        void release(int* pRes) const throw()
        {
            std::cout << "free 4k bytes " << std::endl;
            delete [] pRes;
            // delete pRes;
        }
        int* r;
    };
    
    void fcn() throw()
    {
        usleep(1000);
        Resource const res(1024);
    }
    
    void fcn2() throw(std::logic_error) // 程序员认为这个函数可能抛出std::exception类型或者其派生类类型的异常
    {
        usleep(1000);
        Resource const res(1000);
        // throw std::exception("a! yi chang le!!!");
        throw std::logic_error("a! yi chang le!!!");
    }
    
    int main()
    {
        //while(true) // 用来验证我的RAII是不是好用,一是注释析构中的release,然后取消注释,通过任务管理器能看的很清楚
        //{
        //    fcn();
        //}
    
        // 把上面注释起来,下面用来看出异常时,能否有效
    
        while(true)
        {
            try
            {
                fcn2();
            }
            catch(std::exception const & e)
            {
                std::cout << e.what() << std::endl;
            }
        }
        return 0;
    }
    

    6654fd3bd6b3e35f32c043a0e11bebff 7108f7fb-fc7f-4d33-ad99-b60f45dec038_size99_w640_h640 6e2ca2bf-95af-4c2d-8144-5d86db5cd0d7_size131_w640_h640 2471f1ec8f8544861a6cc4c3cec0871b 4138c2aaf6855a4b0a743619cce6dfed

    4238deb5-c86c-4edb-9dfd-abb91cb26d52_size102_w640_h640 6351a76a213923017297eac173357795

  • 相关阅读:
    Linux mint OS
    Patroni 修改配置
    0x10
    01
    split
    IO流18 --- RandomAccessFile实现数据的读写操作 --- 技术搬运工(尚硅谷)
    IO流16 --- 对象流操作字符串 --- 技术搬运工(尚硅谷)
    IO流15 --- 数据流操作Java语言的基本数据类型 --- 技术搬运工(尚硅谷)
    IO流14 --- 打印流的使用 --- 技术搬运工(尚硅谷)
    JDBC2 --- 获取数据库连接的方式二 --- 技术搬运工(尚硅谷)
  • 原文地址:https://www.cnblogs.com/sunyongjie1984/p/4306061.html
Copyright © 2020-2023  润新知