资源获取即初始化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;
}

时间: 2025-01-19 21:26:46

资源获取即初始化RAII的相关文章

RAII(资源获取即初始化)详解

概念 使用局部对象管理资源的技术通常称为"资源获取就是初始化" Resource Acquisition Is Initialization 机制是Bjarne Stroustrup首先提出的.要解决的是这样一个问题: 在C++中,如果在这个程序段结束时需要完成一些资源释放工作,那么正常情况下自然是没有什么问题,但是当一个异常抛出时,释放资源的语句就不会被执行.于是Bjarne Stroustrup就想到确保能运行资源释放代码的地方就是在这个程序段(栈帧)中放置的对象的析构函数了,因为

关于UI资源获取资源的好的网站

前言:和我一样喜欢UI的一定喜欢这里的内容. 下面是关于sketch资源获取网页,点击图片就能进入: 连接是:https://github.com/JakeLin 居然意外百度到Sketch中国,还提供sketch破解版下载哦:http://www.sketchs.cn/index.html Sketch 资源合集:http://www.ui.cn/detail/15895.html

Struts2 Web 资源获取的四种方式

Struts2 Web 资源获取一个有四种方式,两个大类 拦截器获取 Web 资源模式 静态对象获取 Web 资源模式 第一种:实现ServletRequestAware.ServletResponseAware.ServletContextAware接口 struts.xml <action name="FirstAction" class="Action.FirstAction"> <result name="success"

SpringMVC基础——参数获取与Servlet资源获取问题

一.SpringMVC 使用 @PathVariable.@RequestParam.@RequestHeader.@CookieValue 等来解决参数获取问题. 1. @PathVariable:映射 URL 绑定的占位符,可以借助于传入到方法参数列表中的 @PathVariable 注解获取到 URL 映射中的参数值.如: <a href="handler01/1">test pathvariable</a> @RequestMapping("/

mit6.828资源获取

自己2017年9月到2月这段时间慢慢把5个lab磨完了,期间遇到了不少困难和疑惑,所以打算通过写博客的形式来回忆,记录和总结自己学习mit6.828的过程. MIT6.828就不用我多介绍了, mit鼎鼎大名的操作系统经典课程,北大,华工等学校的操作系统实验都是基于这个课程的实验部分.课程所有的lab都是开源的,课程实验包括6个实验, 包含 Booting a PC Memory Management User Environments Preemptive Multitasking File

Web资源获取

1.拦截器获取 Web 资源模式 2.静态对象获取 Web 资源模式 1.拦截器获取 Web 资源模式: (1)使用Struts2 Aware拦截器 index.jsp表单: <body> <form action="<%=path %>/firstAction" method="post"> 姓名:<input type="text" name="name"><br>

Android 项目中的资源获取方法

Android资源文件分类: Android资源文件大致可以分为两种: 第一种是res目录下存放的可编译的资源文件: 这种资源文件系统会在R.java里面自动生成该资源文件的ID,所以访问这种资源文件比较简单,通过R.XXX.ID即可: 第二种是assets目录下存放的原生资源文件: 因为系统在编译的时候不会编译assets下的资源文件,所以我们不能通过R.XXX.ID的方式访问它们.那我么能不能通过该资源的绝对路径去访问它们呢?因为apk安装之后会放在/data/app/**.apk目录下,以

各类地址及资源获取的方式

搭建虚拟主机后,而不是利用eclipse把工程发布到tomcat中的一些错误 1.首先jstl,standard.jar包得导入,否则运行会出现异常 org.apache.jasper.JasperException: This absolute uri http://java.sun.com/jsp/jstl/core) cannot be resolved in either web.xml or the jar files deployed with this application,而不

Java多线程~~~使用信号量来控制资源获取

在多线程开发中,有一个很经典的名词,那就是信号量.信号量就是用来衡量一个资源的可利用数目的,根据信号 量的多少来控制在多线程中各个资源之间的冲突问题,在Java中也提供了对信号量的支持. 而且在创建信号量的时候,第二个参数用来指定采取何种分配策略,比如当有很多线程被阻塞,但有一个机会的时 候,信号量应该选择谁去运行呢,如果选择true,就采用公平模式,到时候看哪个线程等待的时间最久,就把机会给那 个等待最久的线程,这样的就是公平分配策略. 下面就用代码来说明一下问题 package com.bi