最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

巧妙使用RAII中的ScopeExit

 更新時間:2021年05月06日 17:11:17   作者:程序喵大人  
Resource Acquisition Is Initialization,資源獲取即初始化,將資源的生命周期與一個對象的生命周期綁定,這篇文章主要介紹了巧妙使用RAII中的ScopeExit,需要的朋友可以參考下

什么是RAII

Resource Acquisition Is Initialization,資源獲取即初始化,將資源的生命周期與一個對象的生命周期綁定,舉例來說就是,把一些資源封裝在類中,在構(gòu)造函數(shù)請求資源,在析構(gòu)函數(shù)中釋放資源且絕不拋出異常,而一個對象在生命周期結(jié)束時會自動調(diào)用析構(gòu)函數(shù),即資源的生命周期與一個對象的生命周期綁定。

RAII的應(yīng)用

見如下代碼:

std::mutex mutex;
void func() {}
void NoRAII() {
    mutex.lock();
    func();
    if (xxx) {
        mutex.unlock();// 多次需要調(diào)用unlock(),還有可能忘記調(diào)用unlock導(dǎo)致一直持有鎖
        return;
    }
    ...
    mutex.unlock();
}
void RAII() { // 不需要顯式調(diào)用unlock
    std::lock_guard<std::mutex> lock(mutex);
    func();
    if (xxx) {
        return;
    }
    ...
    return;
}

RAII的應(yīng)用非常多,C++的STL基本都遵循RAII規(guī)范,典型的如vector, string, lock_guard, unique_lock, shared_ptr, unique_ptr等,這里不會介紹這些STL的使用,相信大家也都會使用,如果有相關(guān)需求可以留言。

RAII的巧用

最近研究了boost中的ScopeExit,發(fā)現(xiàn)這是個很高級的特性,利用RAII特性,可以在作用域結(jié)束時自動關(guān)閉已經(jīng)打開的資源或做某些清理操作,類似于unique_ptr,但又比unique_ptr方便,不需要自定義delete函數(shù)。
舉例: 如果沒有ScopeExit

void test () {
    char *test = new char[100];
    if (a) {
        delete[] test; // count 1
        return;
    }
    xxx;
    if (b) {
        delete[] test; // count 2
        return;
    }
    ...
    delete[] test; // count 3
}

使用了ScopeExit

void test () {
    char *test = new char[100];
    std::ofstream ofs("test.txt");
    ScopeExit {
        delete[] test; // 在test函數(shù)生命周期結(jié)束后自動執(zhí)行delete[]操作
      ofs.close(); // 在生命周期結(jié)束后自動關(guān)閉文件,這里只是舉個不恰當(dāng)例子,ofstream自動生命周期結(jié)束后就會關(guān)閉
    };
    if (a) {
        return;
    }
    xxx;
    if (b) {
        return;
    }
    ...
}

當(dāng)然,正常C++代碼不鼓勵使用裸指針,可以使用智能指針來申請資源,這里只是舉個例子,使用ScopeExit也可以用于處理文件資源的關(guān)閉等等。

兩者代碼比較后優(yōu)劣程度顯而易見,不使用ScopeExit需要在return前多次做資源清理操作,而使用了ScopeExit則只需做一次聲明后在作用域結(jié)束后會自動進(jìn)行相關(guān)的資源清理操作,方便而且不易出錯。

ScopeExit實(shí)現(xiàn)

這里參考boost使用C++11實(shí)現(xiàn)了一套ScopeExit機(jī)制

class ScopeExit {
   public:
    ScopeExit() = default;

    ScopeExit(const ScopeExit&) = delete;
    void operator=(const ScopeExit&) = delete;

    ScopeExit(ScopeExit&&) = default;
    ScopeExit& operator=(ScopeExit&&) = default;

    template <typename F, typename... Args>
    ScopeExit(F&& f, Args&&... args) {
        func_ = std::bind(std::forward<F>(f), std::forward<Args>(args)...);
    }

    ~ScopeExit() {
        if (func_) {
            func_();
        }
    };

   private:
    std::function<void()> func_;
};

#define _CONCAT(a, b) a##b
#define _MAKE_SCOPE_(line) ScopeExit _CONCAT(defer, line) = [&]()

#undef SCOPE_GUARD
#define SCOPE_GUARD _MAKE_SCOPE_(__LINE__)

使用方式如下:

void test () {
    char *test = new char[100];
    std::ofstream ofs("test.txt");
    SCOPE_GUARD{
        delete[] test;
        ofs.close();
    };
    if (a) {
        return;
    }
    ...
    if (b) {
        return;
    }
    ...
}

RAII還有很多有趣的妙用,后續(xù)還會介紹,請持續(xù)關(guān)注。

到此這篇關(guān)于巧妙使用RAII中的ScopeExit的文章就介紹到這了,更多相關(guān)RAII妙用ScopeExit內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言常用占位符的使用小結(jié)

    C語言常用占位符的使用小結(jié)

    占位符是一種用于格式化輸出的特殊字符,通常用于 printf() 等輸出函數(shù)中,本文主要介紹了C語言常用占位符的使用小結(jié),非常具有實(shí)用價值,需要的朋友可以參考下
    2023-05-05
  • 養(yǎng)成良好的C++編程習(xí)慣之內(nèi)存管理的應(yīng)用詳解

    養(yǎng)成良好的C++編程習(xí)慣之內(nèi)存管理的應(yīng)用詳解

    "養(yǎng)成良好的編程習(xí)慣"其實(shí)是相當(dāng)綜合的一個命題,可以從多個角度、維度和層次進(jìn)行論述和評判,如代碼的風(fēng)格、效率和可讀性;模塊設(shè)計(jì)的靈活性、可擴(kuò)展性和耦合度等等,要試圖把所有方面都闡述清楚必須花很多的精力,而且也不一定能闡述得全面
    2013-05-05
  • 使用QPainter畫一個3D正方體

    使用QPainter畫一個3D正方體

    這篇文章主要為大家詳細(xì)介紹了使用QPainter畫一個3D正方體,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • c語言讀取csv文件和c++讀取csv文件示例分享

    c語言讀取csv文件和c++讀取csv文件示例分享

    這篇文章主要介紹了c語言讀取csv文件和c++讀取csv文件示例,需要的朋友可以參考下
    2014-03-03
  • 用C語言實(shí)現(xiàn)自動售貨機(jī)

    用C語言實(shí)現(xiàn)自動售貨機(jī)

    這篇文章主要為大家詳細(xì)介紹了用C語言實(shí)現(xiàn)自動售貨機(jī),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C++ 實(shí)現(xiàn)PE文件特征碼識別的步驟

    C++ 實(shí)現(xiàn)PE文件特征碼識別的步驟

    PE文件就是我們常說的EXE可執(zhí)行文件,針對文件特征的識別可以清晰的知道該程序是使用何種編程語言實(shí)現(xiàn)的,前提是要有特征庫,PE特征識別有多種形式,第一種是靜態(tài)識別,第二種則是動態(tài)識別,我們經(jīng)常使用的PEID查殼工具是基于靜態(tài)檢測的方法。
    2021-06-06
  • C++輸入流和輸出流 超級詳細(xì)

    C++輸入流和輸出流 超級詳細(xì)

    C++ 的開發(fā)者認(rèn)為數(shù)據(jù)輸入和輸出的過程也是數(shù)據(jù)傳輸?shù)倪^程,數(shù)據(jù)像水一樣從一個地方流動到另一個地方,所以 C++ 中將此過程稱為“流”,實(shí)現(xiàn)此過程的類稱為“流類”。下面小編將詳細(xì)介紹這個話題,需要的朋友可以參考一下
    2021-09-09
  • C語言計(jì)算Robots機(jī)器人行走路線

    C語言計(jì)算Robots機(jī)器人行走路線

    這篇文章介紹了C語言計(jì)算Robots機(jī)器人行走路線,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • C++中int類型按字節(jié)打印輸出的方法

    C++中int類型按字節(jié)打印輸出的方法

    這篇文章主要給大家介紹了關(guān)于C++中int類型按字節(jié)打印輸出的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • 基于C++實(shí)現(xiàn)信息管理系統(tǒng)

    基于C++實(shí)現(xiàn)信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了基于C++實(shí)現(xiàn)信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評論

香格里拉县| 望江县| 屯留县| 浠水县| 江门市| 鹤壁市| 和田市| 宁强县| 凌海市| 襄城县| 巩留县| 博兴县| 神木县| 历史| 利辛县| 揭阳市| 永靖县| 漾濞| 阳原县| 延安市| 子长县| 揭阳市| 凌源市| 太仆寺旗| 潜山县| 遵化市| 清河县| 丁青县| 延安市| 抚松县| 巫山县| 临汾市| 湟源县| 南澳县| 瑞昌市| 灵石县| 子长县| 如东县| 白玉县| 福海县| 阳泉市|