精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C++ RAII初探+析構(gòu)函數(shù)

開發(fā) 前端
AII并不是一個新鮮的特性,而是古早就有的一種范式。上面例子展示了對象創(chuàng)建的時候獲取資源,對象銷毀的時候釋放資源的例子。

前言

早期編寫的C++是有缺陷的,舉些例子。比如裸指針滿天飛,多線程的數(shù)據(jù)競爭,雙重釋放等等。但如今的C++正在努力改善這些缺陷,RAII范式的編程在C++比重逐步增加。RAII(Resource Acquisition Is Initialization)是C++之父Bjarne Stroustrup在設(shè)計C++的時候就引入了。即:資源獲取即初始化。通俗點,在對象創(chuàng)建的時候獲取資源,在對象銷毀的時候釋放資源。確保內(nèi)存的安全性。指針shared_ptr就是其中的杰作,下面也會講到。

本篇除了RAII之外,還會分析下其析構(gòu)函數(shù)的關(guān)聯(lián)。代碼部分,經(jīng)過C++20測試,均可跑通,可直接用。

RAII操作例子

一個非常簡單的RAII操作,我們初始化對象的時候打開了文件資源。然后在離開對象的作用域的時候,會調(diào)用析構(gòu)函數(shù)釋放(關(guān)閉)文件資源,例子如下:

//filename:RAII.c
//compile:g++ -g -static -o RAII RAII.c


#include <iostream>
#include <memory>


class File {
public:
    File(const std::string& filename) {
        // 在構(gòu)造函數(shù)中打開文件
        std::cout << "Opening file: " << filename << std::endl;
        file_ = fopen(filename.c_str(), "r");
        if (!file_) {
            throw std::runtime_error("Failed to open file");
        }
    }


    ~File() {
        // 在析構(gòu)函數(shù)中關(guān)閉文件
        if (file_) {
            std::cout << "Closing file." << std::endl;
            fclose(file_);
        }
    }


private:
    FILE* file_;
};


int main() {
    try {
        // 創(chuàng)建 File 對象,RAII 確保文件在生命周期結(jié)束時自動關(guān)閉
        File f("example.txt");


        
    } catch (const std::exception& e) {
        std::cerr << e.what() << std::endl;
    }


    
    return 0;
}

File對象的構(gòu)造函數(shù)里面打開文件,上面代碼運(yùn)行的結(jié)果如下:

圖片圖片

在File對象f離開作用域也即是try塊的結(jié)尾大括號處,會調(diào)用析構(gòu)函數(shù),關(guān)閉文件。

關(guān)于這點我們lldb驗證下,且簡略分析下其原理。在~File()析構(gòu)函數(shù)下斷,其堆棧是在RAII.c:36也即是try塊大括號結(jié)尾的地方調(diào)用了析構(gòu)函數(shù)。

如下:

(lldb) b ~File()
Breakpoint 2: where = RAII`File::~File() + 16 at RAII.c:17:13, address = 0x000000000040582c
(lldb) r&c
Process 4510 resuming
Opening file: example.txt
Process 4510 stopped
* thread #1, name = 'RAII', stop reason = breakpoint 2.1
    frame #0: 0x000000000040582c RAII`File::~File(this=0x00007fffffffe208) at RAII.c:17:13
   14
   15       ~File() {
   16           // 在析構(gòu)函數(shù)中關(guān)閉文件
-> 17           if (file_) {
   18               std::cout << "Closing file." << std::endl;
   19               fclose(file_);
   20           }
(lldb) bt
* thread #1, name = 'RAII', stop reason = breakpoint 2.1
  * frame #0: 0x000000000040582c RAII`File::~File(this=0x00007fffffffe208) at RAII.c:17:13
    frame #1: 0x00000000004055ef RAII`main at RAII.c:36:5
    frame #2: 0x00000000004b7ec8 RAII`__libc_start_call_main + 104
    frame #3: 0x00000000004ba090 RAII`__libc_start_main + 624
    frame #4: 0x0000000000405475 RAII`_start + 37

當(dāng)我們運(yùn)行到try塊收尾大括號處,看此時程序剛好調(diào)用了File::~File

(lldb) n
Opening file: example.txt
Process 4552 stopped
* thread #1, name = 'RAII', stop reason = step over
    frame #0: 0x00000000004055e3 RAII`main at RAII.c:33:5
   30           File f("example.txt");
   31
   32           // 文件操作...
-> 33       } catch (const std::exception& e) {
   34           std::cerr << e.what() << std::endl;
   35       }
   36
(lldb) di -s $pc
RAII`main:
->  0x4055e3 <+110>: lea    rax, [rbp - 0x58]
    0x4055e7 <+114>: mov    rdi, rax
    0x4055ea <+117>: call   0x40581c       ; File::~File at RAII.c:18:5
    0x4055ef <+122>: mov    eax, 0x0
    0x4055f4 <+127>: mov    rdx, qword ptr [rbp - 0x18]
    0x4055f8 <+131>: sub    rdx, qword ptr fs:[0x28]

也即是代碼:

0x4055ea <+117>: call   0x40581c       ; File::~File at RAII.c:18:5

RAII風(fēng)格指針

現(xiàn)代C++的幾個指針

  • std::unique_ptr:獨(dú)占所有權(quán)的智能指針。一個 unique_ptr 只能有一個指針指向資源,因此它不支持復(fù)制,只支持轉(zhuǎn)移所有權(quán)。
  • std::shared_ptr:共享所有權(quán)的智能指針。多個 shared_ptr 可以共享對資源的所有權(quán),只有最后一個指針被銷毀時,資源才會被釋放。
  • std::weak_ptr:一種不影響資源生命周期的智能指針,用來打破循環(huán)引用的問題

我們也來觀察下RAII指針自動調(diào)用析構(gòu)函數(shù)釋放的例子

//filename:zhizhen.c
//compile:g++ -std=c++20 -g -static -o zhizhen zhizhen.c
#include <iostream>
#include <memory>


class Resource {
public:
    Resource(const std::string& name) : name_(name) {
        std::cout << name_ << " acquired!" << std::endl;
    }


    ~Resource() {
        std::cout << name_ << " released!" << std::endl;
    }


    void use() {
        std::cout << "Using " << name_ << std::endl;
    }


private:
    std::string name_;
};


void demonstrateWeakPtr() {
    // 創(chuàng)建 shared_ptr 管理 Resource 對象
    std::shared_ptr<Resource> sharedResource = std::make_shared<Resource>("Resource1");


    // 創(chuàng)建 weak_ptr 觀察 shared_ptr
    std::weak_ptr<Resource> weakResource = sharedResource;


    // weak_ptr 不增加引用計數(shù),它只是觀察資源
    std::cout << "Weak pointer created, but it does not affect resource's reference count." << std::endl;


    // 使用 weak_ptr 的 lock 方法來獲取 shared_ptr
    if (auto lockedResource = weakResource.lock()) {
        lockedResource->use();  // 使用資源
    } else {
        std::cout << "Failed to lock weak pointer, resource is not available." << std::endl;
    }


    // 當(dāng) shared_ptr 離開作用域時,資源會被釋放
}


int main() {
    demonstrateWeakPtr();  // 資源由 shared_ptr 管理,weak_ptr 只是觀察


    return 0;
}

它的結(jié)果如下,同樣的析構(gòu)函數(shù)在離開作用域釋放

圖片圖片

結(jié)尾

RAII并不是一個新鮮的特性,而是古早就有的一種范式。上面例子展示了對象創(chuàng)建的時候獲取資源,對象銷毀的時候釋放資源的例子。

我們只需要寫好代碼的規(guī)范,其它的編譯器都給做了,比如析構(gòu)函數(shù)的調(diào)用等。這種操作,有效的防范了部分內(nèi)存泄露的可能性。

責(zé)任編輯:武曉燕 來源: 江湖評談
相關(guān)推薦

2010-01-18 15:53:27

C++析構(gòu)函數(shù)

2010-02-04 16:39:26

C++析構(gòu)函數(shù)

2011-07-15 01:29:39

C++析構(gòu)函數(shù)

2024-12-19 14:42:15

C++內(nèi)存泄漏內(nèi)存管理

2010-02-05 13:35:19

C++虛析構(gòu)函數(shù)

2009-08-14 17:24:28

C#構(gòu)造函數(shù)和析構(gòu)函數(shù)

2009-09-03 13:14:55

C#構(gòu)造函數(shù)C#析構(gòu)函數(shù)

2009-08-19 09:57:01

C++ RAII

2011-06-09 15:04:22

RAII機(jī)制

2021-12-11 19:02:03

函數(shù)C++對象

2009-07-30 15:24:13

C#析構(gòu)函數(shù)C#構(gòu)造函數(shù)

2011-06-15 09:47:14

C++

2010-01-20 14:25:56

函數(shù)調(diào)用

2025-04-11 07:50:00

虛析構(gòu)函數(shù)C++開發(fā)

2024-12-11 16:00:00

C++函數(shù)編譯器

2010-01-25 10:10:42

C++函數(shù)參數(shù)

2009-09-02 10:49:46

C#調(diào)用析構(gòu)方法

2010-07-20 09:52:27

Perl構(gòu)造函數(shù)

2025-08-28 09:21:25

2009-12-04 17:16:41

PHP析構(gòu)函數(shù)
點贊
收藏

51CTO技術(shù)棧公眾號

亚洲黄色小视频| 国产美女主播视频一区| 一区二区亚洲欧洲国产日韩| 一级做a免费视频| 99视频免费在线观看| 成人网在线播放| 国产v综合v亚洲欧美久久| 欧美日韩黄色网| 久久精品色播| 欧美日韩精品欧美日韩精品| 妺妺窝人体色www看人体| 亚洲色图欧美视频| 久久99精品国产.久久久久久| 欧美多人乱p欧美4p久久| 亚洲天堂久久新| 涩涩屋成人免费视频软件| 欧美日韩一区二区在线播放| 天天干天天色天天爽| 天堂在线中文字幕| 韩国精品一区二区| 情事1991在线| 久久久精品91| 久久网站免费观看| 亚洲嫩模很污视频| 无码国产精品久久一区免费| 88xx成人永久免费观看| 亚洲国产日产av| youjizz.com亚洲| 黄色在线视频观看网站| 成人教育av在线| 5566av亚洲| 中文字幕一区二区三区波野结| 亚洲国产黄色| 欧美黑人一区二区三区| 我要看一级黄色录像| 欧美天堂社区| 亚洲国产精品电影在线观看| 午夜影院免费版| 国产a亚洲精品| 一本久久综合亚洲鲁鲁五月天| 欧洲精品一区二区三区久久| 天堂av中文在线| 综合av第一页| 一区二区免费在线观看| 黑人与亚洲人色ⅹvideos| av在线不卡电影| 国产精品一区二区欧美| 精品免费久久久| 极品美女销魂一区二区三区免费| 国产精品亚洲片夜色在线| 国产免费一级视频| 久久动漫亚洲| 日韩av男人的天堂| 69亚洲精品久久久蜜桃小说| 亚洲女人av| 91精品国产99| 草久久免费视频| 亚洲一区二区毛片| 欧美野外猛男的大粗鳮| 亚洲欧美偷拍视频| 老**午夜毛片一区二区三区| 国产成人精品视频| 日韩国产成人在线| 日韩电影一区二区三区四区| 国产精品精品视频| 黄色一区二区视频| 精品在线播放免费| 91久久精品一区二区别| 亚洲国产成人一区二区| 高清在线观看日韩| 精品蜜桃一区二区三区| 亚洲欧美日韩免费| 国产调教视频一区| 伊人久久大香线蕉成人综合网| 国产婷婷视频在线| 亚洲国产成人高清精品| 日本在线xxx| 户外露出一区二区三区| 欧美年轻男男videosbes| 国产永久免费网站| 成人av资源网址| 日韩精品中文字幕在线| 国产激情av在线| 伊人久久大香线蕉综合四虎小说| 久久久久久久久网站| 国产一级片毛片| 日本亚洲欧美天堂免费| 99高清视频有精品视频| 天堂在线中文| 中文字幕亚洲不卡| 伊人成色综合网| 国产成人精选| 亚洲福利视频在线| 高清国产在线观看| 欧美极品一区二区三区| 欧美主播福利视频| 国产普通话bbwbbwbbw| av一区二区不卡| 一本久久a久久精品vr综合| 日本片在线看| 欧美综合一区二区三区| 国内精品国产三级国产aⅴ久| 日韩av系列| 成人444kkkk在线观看| 欧美日韩乱国产| 日韩av中文字幕一区二区| 奇米影视777在线欧美电影观看 | 日本精品久久久久| 99久久国产综合精品女不卡| 亚欧精品在线| 成年女人在线看片| 51精品国自产在线| 尤物视频最新网址| 红桃视频国产精品| 国产精品一区久久久| 性xxxx18| 亚洲免费在线电影| 亚洲综合日韩欧美| 四虎5151久久欧美毛片| 欧美猛男性生活免费| 中文字幕福利视频| 亚洲人123区| 免费高清一区二区三区| 成人mm视频在线观看| 亚洲国产成人在线播放| 三级全黄做爰视频| 日韩一区精品字幕| 九色91视频| 欧美人动性xxxxz0oz| 欧美日韩一级片在线观看| 一卡二卡三卡四卡| 亚洲精品孕妇| 福利视频久久| 中文字幕资源网在线观看| 欧美日韩国产首页在线观看| 精品久久久久久中文字幕人妻最新| 午夜精品电影| 91麻豆国产精品| jizz亚洲| 欧美午夜精品久久久久久孕妇| 精品人妻一区二区三区日产乱码卜| 欧美日韩国产色综合一二三四| 91免费综合在线| 欧美69xxxx| 正在播放一区二区| 蜜桃av免费在线观看| 老司机精品久久| 日本精品免费| 二吊插入一穴一区二区| 亚洲欧美中文日韩在线v日本| 成人毛片18女人毛片| av在线播放成人| 国产精品秘入口18禁麻豆免会员| 久久久免费毛片| 久久人人看视频| 五月天激情婷婷| 欧美日韩在线视频一区| 国产精品久久不卡| 亚洲一区二区毛片| 欧美综合激情| 精品三级在线| 久久精品国产电影| 亚洲成人一级片| 亚洲第一精品在线| 国产中文字幕一区二区| 先锋影音久久久| 色阁综合av| 电影中文字幕一区二区| 美日韩精品视频免费看| 全部免费毛片在线播放一个| 婷婷国产v国产偷v亚洲高清| 国产熟妇搡bbbb搡bbbb| 日韩电影一区二区三区| eeuss中文| 国产 日韩 欧美 综合 一区| 97超级碰碰人国产在线观看| 国产高清免费av在线| 欧美精品777| 国产一级视频在线| 国产日韩欧美综合在线| 日韩精品视频网址| 亚洲美女啪啪| 视频一区免费观看| 日韩精品一区国产| 欧美亚洲日本网站| 欧美激情黑人| 亚洲国产精品99久久| 中文字幕在线天堂| 亚洲精品一二三四区| 色婷婷免费视频| 另类综合日韩欧美亚洲| 激情小视频网站| 国产一区二区三区四区| http;//www.99re视频| 秋霞国产精品| 欧美麻豆久久久久久中文| 免费在线高清av| 日韩三级中文字幕| 免费看日批视频| 亚洲欧美偷拍卡通变态| 最近中文字幕在线mv视频在线| 韩国一区二区在线观看| 黄色网页免费在线观看| **女人18毛片一区二区| 久久精品99久久| 粉嫩一区二区三区在线观看| 欧洲美女7788成人免费视频| 五月天激情在线| 一本一道久久a久久精品逆3p| 亚洲成a人片77777精品| 欧美婷婷六月丁香综合色| 日本熟妇毛茸茸丰满| 18欧美乱大交hd1984| 超碰97人人干| 成人avav影音| 手机看片国产精品| 免费成人性网站| 欧美色图另类小说| 亚洲区第一页| 欧美美女黄色网| 婷婷综合视频| 亚洲欧美丝袜| 精品免费视频| 免费看国产精品一二区视频| 日韩欧美中文在线观看| 国产综合香蕉五月婷在线| 国产精品扒开腿做爽爽爽视频软件| 欧美黑人狂野猛交老妇| 成人av福利| 神马久久桃色视频| 最新电影电视剧在线观看免费观看| 亚洲精品国产福利| 日本精品久久久久| 精品裸体舞一区二区三区| jizz中国少妇| 欧美一区二区日韩| a毛片在线免费观看| 欧美人妖巨大在线| 伊人网综合在线| 欧美私人免费视频| 欧美在线视频精品| 在线观看日韩毛片| 人人妻人人爽人人澡人人精品| 欧美日韩激情网| 看片网址国产福利av中文字幕| 亚洲国产欧美在线| 日韩av男人天堂| 亚洲福利电影网| 中文字幕在线观看免费视频| 精品久久久久久久久久久久久 | 伊人五月天婷婷| 精品写真视频在线观看| 欧美又黄又嫩大片a级| 紧缚奴在线一区二区三区| 中文字幕第22页| 国产老女人精品毛片久久| 欧美性猛交xx| 成人网页在线观看| 国产福利短视频| 国产网红主播福利一区二区| 岛国片在线免费观看| 亚洲欧美日韩久久精品| 精品99久久久久成人网站免费| 亚洲综合精品久久| 国产福利拍拍拍| 色婷婷综合久久久| 在线观看中文字幕网站| 欧美一区日本一区韩国一区| 亚洲第一大网站| 日韩av资源在线播放| 看电影就来5566av视频在线播放| 中文字幕精品一区久久久久| 麻豆视频在线| 欧美国产日韩视频| sese综合| 成人国产精品av| 大型av综合网站| 欧洲精品亚洲精品| 中文视频一区| 欧美黑人经典片免费观看| 日韩avvvv在线播放| 无套白嫩进入乌克兰美女| 成人av在线一区二区三区| 中国女人特级毛片| 一二三区精品福利视频| 无码人妻精品一区二区三区9厂| 欧美日韩免费视频| 后进极品白嫩翘臀在线视频| 亚洲一二在线观看| 美女尤物在线视频| 国产精品久久久久久久久久| 亚洲图色一区二区三区| 欧美专区一二三| 国产中文一区| 97公开免费视频| 国产成人高清在线| 97人妻人人揉人人躁人人| 一区二区三区欧美久久| 国产成人精品777777| 日韩一区二区三区电影在线观看 | 天天综合天天干| 制服视频三区第一页精品| 欧美美女色图| 欧美夫妻性生活视频| 欧美另类激情| 精品不卡在线| 国产精品va| 日韩一区二区三区久久| 久久久久免费观看| 久久久久免费看| 欧美狂野另类xxxxoooo| 女人天堂在线| 97精品欧美一区二区三区| 国产成人久久精品一区二区三区| 欧美日韩精品免费观看视一区二区 | 日韩av片在线免费观看| 欧美日韩激情小视频| 国产白浆在线观看| 日韩在线精品一区| 成人影院大全| 精品蜜桃一区二区三区| 伊人蜜桃色噜噜激情综合| 国产乱叫456| 国产精品久久久一本精品| 中文字幕手机在线视频| 日韩国产欧美精品一区二区三区| 三级网站视频在在线播放| 成人午夜两性视频| 久久国产精品亚洲人一区二区三区 | 91精品影视| 久久久水蜜桃| 亚洲欧洲综合| 国产一卡二卡三卡四卡| 亚洲伊人色欲综合网| 99久久国产热无码精品免费| 色老头一区二区三区| 78精品国产综合久久香蕉| 欧美日韩一区二区三| 先锋影音久久久| 九色porny自拍视频| 精品日韩中文字幕| 亚洲人妻一区二区三区| 97视频在线观看免费高清完整版在线观看 | 国产黄色在线网站| 成人福利免费观看| 天天综合一区| www激情五月| 亚洲精品久久久久久国产精华液| av 一区二区三区| 九九精品在线播放| 超碰地址久久| 亚洲午夜无码av毛片久久| 久久久久久日产精品| 男操女视频网站| 色天天综合狠狠色| 欧美成人精品一级| www婷婷av久久久影片| 成人激情视频网站| 久久99精品波多结衣一区| 亚洲欧洲在线播放| 国产精成人品2018| dy888午夜| 成人av电影在线播放| 亚洲欧美偷拍视频| 日韩一区视频在线| 日韩激情欧美| 国产免费黄色一级片| 26uuu欧美| 在线观看国产黄| 欧美黑人性猛交| 国产一区99| 国产5g成人5g天天爽| 天天色综合天天| yourporn在线观看中文站| 91色视频在线导航| 亚洲国内自拍| 天天干天天舔天天操| 日韩亚洲欧美在线| 深夜成人在线| 麻豆中文字幕在线观看| 波多野结衣91| 91片黄在线观看喷潮| 久久久久久久网站| 精品99在线| 日本人妻一区二区三区| 色狠狠色狠狠综合| а天堂中文在线官网| 美女被啪啪一区二区| 极品少妇xxxx偷拍精品少妇| 91av在线免费视频| 日韩在线观看免费全| 国产毛片精品| 国产精品嫩草影院8vv8| 午夜精品一区在线观看| 毛片在线不卡| 日本电影一区二区三区| 丰满亚洲少妇av| 国产又粗又猛视频| 欧美一级高清免费播放| 中文字幕一区二区av |