首页 > 其他分享 >RAII

RAII

时间:2023-10-18 23:11:06浏览次数:32  
标签:std RAII mutex pthread shared 资源

RAII(Resource Acquisition Is Initialization)翻译过来就是资源获取即初始化,更准确的表达是使用对象来管理资源。
单纯依靠new和delete的期望执行是行不通的,甚至有时会有隐藏new的资源(比如函数返回的资源)。因此我们寄希望于析构函数自动调用的机制来确保资源释放。对于局部作用域内的资源,可以使用栈对象来管理,而对于堆上的资源,可以使用智能指针来管理。不要将资源的申请和释放分开进行,这样可以避免手动释放资源的麻烦,也可以避免忘记释放资源的错误。
以对象管理资源的关键步骤:

  1. 获得资源后立刻放入管理对象,因此叫做RAII
  2. 管理对象运行析构函数确保释放资源

以下是一些RAII的例子
范围互斥锁,在进入作用域内时获得锁,离开作用域时释放锁

class MutexLock {
public:
    MutexLock(pthread_mutex_t* mutex_t):mutex(mutex_t) {
        lock();
    }
    ~MutexLock() {
        unlock();
    }
    void lock() {
        pthread_mutex_lock(mutex);
    }
    void unlock() {
        pthread_mutex_unlock(mutex);
    }
private:
    pthread_mutex_t* mutex;
};

智能指针就是RAII的一个例子
shared_ptr在引用计数为0时自动释放资源,但无法破除环状引用

一个例子

#include<memory>
#include<iostream>
using namespace std;
class B;
int cnt=0;
class A {
public:
    std::shared_ptr<B> bPtr;
    ~A(){
        cout<<cnt--<<" ";
        cout<<"A is deleted"<<endl;
    }
    A(){
        cnt++;
        cout<<"A is created"<<endl;
    }
};

class B {
public:
    std::shared_ptr<A> aPtr;
    ~B(){
        cout<<cnt--<<" ";
        cout<<"B is deleted"<<endl;
    }
    B(){
        cnt++;
        cout<<"B is created"<<endl;
    }
};

int main() {
    // circle
    std::shared_ptr<A> a = std::make_shared<A>();
    std::shared_ptr<B> b = std::make_shared<B>();

    a->bPtr = b;
    b->aPtr = a;

    cout<<a.get()<<endl;
    cout<<b.get()<<endl;
    cout<<a->bPtr.get()<<endl;
    cout<<b->aPtr.get()<<endl;
    return 0;
}

/*
A is created
B is created
0x1031770
0x1031ae0
0x1031ae0
0x1031770
*/

image

标签:std,RAII,mutex,pthread,shared,资源
From: https://www.cnblogs.com/wangerblog/p/17773638.html

相关文章

  • C++ RAII在HotSpot VM中的重要应用
    RAII(ResourceAcquisitionIsInitialization),也称为“资源获取就是初始化”,是C++语言的一种管理资源、避免泄漏的惯用法。C++标准保证任何情况下,已构造的对象最终会销毁,即它的析构函数最终会被调用。简单的说,RAII的做法是使用一个对象,在其构造时获取资源,在对象生命期控制范围之下......
  • C++ RAII在HotSpot VM中的重要应用
    RAII(ResourceAcquisitionIsInitialization),也称为“资源获取就是初始化”,是C++语言的一种管理资源、避免泄漏的惯用法。C++标准保证任何情况下,已构造的对象最终会销毁,即它的析构函数最终会被调用。简单的说,RAII的做法是使用一个对象,在其构造时获取资源,在对象生命期控制范围之下......
  • 3.使用智能指针管理内存资源,RAII是怎么回事?
    3.使用智能指针管理内存资源,RAII是怎么回事?什么是RAII?RAII是ResourceAcquisitionIsInitialization(wiki上面翻译成“资源获取就是初始化”)的简称,是C++语言的一种管理资源、避免泄漏的惯用法。利用的就是C++构造的对象最终会被销毁的原则。RAII的做法是使用一个对象,在其构造时......
  • RAII技法的工具类scope_guard
    #pragmaonce/*************************************************************************************描述:RAII技法的工具类使用说明://资源释放voidfoo(){HANDLEh=OpenFile(...);ON_SCOPE_EXIT([&]{CloseHandle(h);});...//usethefile}//whenth......
  • C++ 惯用法之 RAII
    RAII(ResourceAcquisitionIsInitialization)资源获取即初始化,是C++中最基本、应用最广范的惯用法(idiom)之一。RAII的基本思想是通过构造/析构函数,对资源的获取/释放进行封装,然后借助局部对象的自动生命周期来管理资源。使用RAII可以让用户无需手动管理资源的获取/释放,减少出......
  • C++面试八股文:什么是RAII?
    C++面试八股文:什么是RAII?某日二师兄参加XXX科技公司的C++工程师开发岗位第13面:面试官:什么是RAII?二师兄:RAII是ResourceAcquisitionIsInitialization的缩写。翻译成中文是资源获取即初始化。面试官:RAII有什么特点和优势?二师兄:主要的特点是,在对象初始化时获取资源,在对......
  • C++面试八股文:什么是RAII?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第13面:面试官:什么是RAII?二师兄:RAII是ResourceAcquisitionIsInitialization的缩写。翻译成中文是资源获取即初始化。面试官:RAII有什么特点和优势?二师兄:主要的特点是,在对象初始化时获取资源,在对象析构时释放资源。这种技术可以......
  • C++面试八股文:什么是RAII?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第13面:面试官:什么是RAII?二师兄:RAII是ResourceAcquisitionIsInitialization的缩写。翻译成中文是资源获取即初始化。面试官:RAII有什么特点和优势?二师兄:主要的特点是,在对象初始化时获取资源,在对象析构时释放资源。这种技术可以......
  • 智能指针与RAII
    对象生存期和资源管理(RAII)RAII:ResourceAcquisitionIsInitialization,资源获取即初始化。是C++语言的一种管理资源、避免泄漏的惯用法。C++标准保证任何情况下,已构造的对象最终会销毁,即它的析构函数最终会被调用。简单的说,RAII的做法是使用一个对象,在其构造时获取资源,在对象生......
  • RAII
    (一)概念RAII全称是ResourceAcquisitionIsInitialization,翻译过来是资源获取即初始化,RAII机制用于管理资源的申请和释放。对于资源,我们通常经历三个过程,申请,使用,释放,这里的资源不仅仅是内存,也可以是文件、socket、锁等等。当一个对象创建的时候,自动调用构造函数,当对象超出作用......