RAII(资源创建即释放)

原创 2016年05月31日 22:44:27

RAII是一种技术,利用了C++局部对象在跳出作用域时执行析构函数的机制,将一些资源的释放安排在析构函数中,保证安全的使用资源。
举个例子:

    A.h
    class A
    {
    public:
        A(int size);
        virtual ~A();
    public:
        void SetMem(int size, char value);
    private:
        int* m_ptrValue;
    }
    A.cpp
    A::A(int size)
    {
        m_ptrValue = (int*)malloc(size);
        assert(m_ptrValue == NULL);
    }
    A::~A()
    {
    }
    void A::SetMem(int size, char value)
    {
        memset(m_ptrValue,value,size);
    }
    main.cpp
    #include "A.h"
    int main()
    {
        A a(100);
        [
            try
            {
                do something error!
            }
            catch()
            {
                //比如抛出了某个异常,并且被捕获。这个异常不是致命的,程序的其它逻辑仍可以继续运行。但是由于其分配的空间没有被释放将会导致越积越多,最终导致内存耗尽而导致整个程序甚至机器崩溃。除非在每一个捕获异常的地方进行手工delete释放。
            }

        ]
    }

看看RAII如何解决这种情况。

A.h
    class A
    {
    public:
        A(int size);
        virtual ~A();
    public:
        void SetMem(int size, char value);
    private:
        int* m_ptrValue;
    }
    A.cpp
    A::A(int size)
    {
        m_ptrValue = (int*)malloc(size);
        assert(m_ptrValue == NULL);
    }
    A::~A()
    {
        delete m_ptrValue;
    }
    void A::SetMem(int size, char value)
    {
        memset(m_ptrValue,value,size);
    }
    main.cpp
    #include "A.h"
    int main()
    {
        A a(100);
        [
            try
            {
                [
                    //某段逻辑抛出异常
                ]
            }
            catch()
            {
                [
                    //捕获并返回,return之后a对象自动调用析构函数将已分配的内存释放,此时无论出现多少次异常,都不会出现内存耗尽的情况。
                ]
            }
        ]
    }

RAII的应用场景很多,boost用于线程同步的互斥量Mutex也使用了此机制。
boost::mutex m_objMutex;
{
boost::mutex::scoped_lock lock(m_objMutex);//加锁
}//退出作用域时解锁

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

RAII:在类的构造函数中分配资源,在析构函数中释放资源

RAII介绍及实例分析:   动物都会摄取食物,吸收其中的营养,用于自身生长和活动。然而,并非食物中所有的物质都能为动物所吸收。那些无法消化的物质,通过消化道的另一头(某些动物消化道只有一头)排出体外...

c++资源管理-----RAII

c++资源管理-----RAII          资源就是一旦使用了它,将来必须还给系统。如果不这样,糟糕的事情就会发生。C++程序中最长使用的资源是动态分配内存。但内存只是你必须管理的众多资源之一...

boost学习之RAII机制(资源申请即初始化)

/* 先介绍下一个专业词汇:RAII(Resource Application Immediately Initialize)资源申请即初始化。 这也是智能指针的基本原理,智能指针只是这个习语的其中...

使用RAII技术来管理资源

我们考虑以下的代码:

RAII惯用法:C++资源管理的利器

RAII惯用法:C++资源管理的利器 RAII是指C++语言中的一个惯用法(idiom),它是“Resource Acquisition Is Initialization”的首字母缩写。中文可将...

[转]RAII:资源获取即初始化

RAII:资源获取即初始化资源获取即初始化(RAII, Resource Acquisition Is Initialization)是指,当你获得一个资源的时候,不管这个资源是对象、内存、文件句柄或...

RAII惯用法:C++资源管理的利器

RAII惯用法:C++资源管理的利器 RAII是指C++语言中的一个惯用法(idiom),它是“Resource Acquisition Is Initialization”的首字母缩写。中文可...

C++必知必会 - RAII(资源获取及初始化)

RAII(资源获取及初始化),即resource acquisition is initialization;他不是某些人以为的“初始化即资源获取”(initialization is resou...
  • fishhg
  • fishhg
  • 2011-05-12 09:19
  • 1745

effective c++条款13-17 “以对象管理资源”之RAII浅析

RAII是指C++语言中的一个惯用法(idiom),它是“Resource Acquisition Is Initialization”的首字母缩写。中文可将其翻译为“资源获取就是初始化”。虽然从某种...

用RAII技术管理资源及其泛型实现

前言 RAII的含义是“资源获取即初始化”。 一段看似安全的代码 首先看一段代码: try{ int *p = new int[100]; // ......
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)