RAII(资源创建即释放)

4 篇文章 0 订阅

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);//加锁
}//退出作用域时解锁

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值