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

巧妙使用RAII中的ScopeExit

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

什么是RAII

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

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等,這里不會(huì)介紹這些STL的使用,相信大家也都會(huì)使用,如果有相關(guān)需求可以留言。

RAII的巧用

最近研究了boost中的ScopeExit,發(fā)現(xiàn)這是個(gè)很高級(jí)的特性,利用RAII特性,可以在作用域結(jié)束時(shí)自動(dòng)關(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é)束后自動(dòng)執(zhí)行delete[]操作
      ofs.close(); // 在生命周期結(jié)束后自動(dòng)關(guān)閉文件,這里只是舉個(gè)不恰當(dāng)例子,ofstream自動(dòng)生命周期結(jié)束后就會(huì)關(guān)閉
    };
    if (a) {
        return;
    }
    xxx;
    if (b) {
        return;
    }
    ...
}

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

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

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ù)還會(huì)介紹,請(qǐng)持續(xù)關(guān)注。

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

相關(guān)文章

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

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

    占位符是一種用于格式化輸出的特殊字符,通常用于 printf() 等輸出函數(shù)中,本文主要介紹了C語言常用占位符的使用小結(jié),非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    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)綜合的一個(gè)命題,可以從多個(gè)角度、維度和層次進(jìn)行論述和評(píng)判,如代碼的風(fēng)格、效率和可讀性;模塊設(shè)計(jì)的靈活性、可擴(kuò)展性和耦合度等等,要試圖把所有方面都闡述清楚必須花很多的精力,而且也不一定能闡述得全面
    2013-05-05
  • 使用QPainter畫一個(gè)3D正方體

    使用QPainter畫一個(gè)3D正方體

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

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

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

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

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

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

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

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

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

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

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

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

    這篇文章主要給大家介紹了關(guān)于C++中int類型按字節(jié)打印輸出的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(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ì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評(píng)論

定陶县| 黎川县| 蕲春县| 中宁县| 成武县| 昌吉市| 玉龙| 县级市| 司法| 保德县| 永年县| 门头沟区| 晋江市| 资溪县| 石屏县| 霞浦县| 化州市| 马关县| 太谷县| 和顺县| 右玉县| 金川县| 罗江县| 顺昌县| 微山县| 连江县| 井陉县| 广河县| 东源县| 正蓝旗| 广州市| 霍州市| 平度市| 海宁市| 黔东| 营口市| 饶平县| 盐津县| 济源市| 昭苏县| 得荣县|