精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

555www成人网| 精品成a人在线观看| 亚洲视频在线观看日本a| 国产一区二区网站| 亚洲乱码视频| 国产一区二区成人| gogo亚洲国模私拍人体| 在线观看的黄色| 国产精品久久久久精k8| 国产在线精品二区| 亚洲综合精品视频| 国产一区二区三区久久| 日韩性xxxx爱| 人妻丰满熟妇aⅴ无码| 97色婷婷成人综合在线观看| 精品欧美一区二区三区| 自拍亚洲欧美老师丝袜| 香港三日本三级少妇66| 理论电影国产精品| 性日韩欧美在线视频| 一本在线免费视频| 亚洲免费观看高清完整版在线观| 欧美一区二区日韩| 99视频免费播放| 9765激情中文在线| 亚洲四区在线观看| 日本不卡一二三区| 图片区 小说区 区 亚洲五月| 精品系列免费在线观看| 国产成人精品久久二区二区91| 欧产日产国产v| 欧美激情黄色片| 亚洲国产一区自拍| 久久久国产精品久久久| 全球中文成人在线| 色综合 综合色| 高清在线观看免费| 日本三级韩国三级欧美三级| 国产精品久久夜| 欧洲av一区| 青梅竹马是消防员在线| 国产宾馆实践打屁股91| 91久久久久久久久久久久久| 中文字幕 欧美激情| 爽好多水快深点欧美视频| 91超碰caoporn97人人| 免费日韩在线视频| 欧美高清不卡| 美女啪啪无遮挡免费久久网站| 亚洲天堂岛国片| 自拍偷拍欧美一区| 亚洲欧美另类中文字幕| 特级西西人体wwwww| 国产精品主播在线观看| 精品国产乱码久久久久久久| 中文字幕在线观看视频www| 日韩专区视频| 7777精品伊人久久久大香线蕉最新版 | 色偷偷偷综合中文字幕;dd| 国产交换配乱淫视频免费| 神马久久影院| 亚洲全黄一级网站| 国产真人做爰视频免费| 精品视频日韩| 中文字幕在线日韩| 日本免费网站视频| 午夜欧美理论片| 欧美高清视频免费观看| 日本五十熟hd丰满| 免费国产自线拍一欧美视频| 欧美亚洲国产一区二区三区va| 成人在线免费观看av| 美女高潮视频在线看| 午夜激情综合网| 国产在线青青草| 精品成人av| 7777精品伊人久久久大香线蕉| 午夜免费一级片| eeuss鲁片一区二区三区| 日韩av在线导航| 免费网站在线高清观看| 91影院成人| 久久久久久久爱| 亚洲黄色小说图片| 蜜桃精品视频在线| 北条麻妃高清一区| 国产小视频免费在线观看| 1000精品久久久久久久久| 97久久国产亚洲精品超碰热| 日本不卡免费高清视频在线| 精品视频1区2区| 69xxx免费视频| 国产亚洲电影| 欧美国产日韩xxxxx| 亚洲欧美日韩激情| 国产精品一区二区视频| 明星裸体视频一区二区| 黄色网页在线看| 午夜精品123| 婷婷中文字幕在线观看| 欧美日韩麻豆| 不卡av在线播放| av大全在线观看| 国产一区二区三区不卡在线观看 | 一区二区三区精品视频在线| 国内精品视频一区二区三区| a∨色狠狠一区二区三区| 日韩欧美一区二区三区在线| 欧美成人国产精品一区二区| 欧美日韩一卡| 国产欧美一区二区三区在线| 日韩av高清在线| 亚洲三级在线播放| 99热成人精品热久久66| 中文字幕久久精品一区二区| 色噜噜狠狠狠综合曰曰曰| 国产成人无码精品亚洲| 国产精品一区二区三区99| 日本不卡一二三区| 色老头在线一区二区三区| 日韩一区二区在线观看视频播放| 久久成人激情视频| 一本综合久久| 国产精品制服诱惑| 国产激情在线| 欧美日韩中文字幕一区| 91精品人妻一区二区| 国产精品久久| 99在线观看视频| 免费av在线| 欧美性一区二区| 国产全是老熟女太爽了| 一区二区三区国产在线| 动漫美女被爆操久久久| av大大超碰在线| 欧美乱妇23p| 国产极品美女高潮无套久久久| 精品国产亚洲一区二区三区| 日韩在线观看成人| 最新中文字幕免费| 国产色产综合色产在线视频| 国产精品宾馆在线精品酒店| 老牛精品亚洲成av人片| 97视频色精品| 午夜激情在线视频| 五月婷婷激情综合| 亚洲美女精品视频| 亚洲无线一线二线三线区别av| 亚洲最大av在线| 天堂av最新在线| 精品免费一区二区三区| 精品无码久久久久久久久| 成人做爰69片免费看网站| av动漫在线播放| 加勒比色老久久爱综合网| 久久人人爽人人爽人人片av高请| 人成网站在线观看| 亚洲成av人片一区二区| 91精品国产自产| 热久久久久久久| 中国人体摄影一区二区三区| 精品午夜视频| 国内精品久久久久久| 五月婷婷六月色| 在线一区二区三区做爰视频网站| 精品无码国产污污污免费网站| 免费av网站大全久久| 99热一区二区三区| 97青娱国产盛宴精品视频| 91精品国产高清自在线看超| 激情小视频在线| 5566中文字幕一区二区电影| 欧美日韩在线观看免费| 成人久久视频在线观看| 97视频在线免费播放| 日韩精品一区二区久久| 亚洲综合精品一区二区| 国产在线美女| 中文字幕久久久av一区| 精品国产av一区二区| 午夜精品久久一牛影视| 自拍偷拍你懂的| 国产白丝网站精品污在线入口| 成年人视频观看| 91亚洲人成网污www| 国产精品久久国产三级国电话系列| 在线黄色的网站| 色系列之999| 免费观看黄色一级视频| 在线观看免费一区| 黄色一级视频免费| 国产婷婷精品av在线| 日日夜夜精品视频免费观看| 国产精品一国产精品k频道56| 亚州欧美一区三区三区在线 | 欧美日韩人妻精品一区二区三区| 成人av在线看| 亚洲成人天堂网| 99国产精品私拍| 自拍另类欧美| 神马影视一区二区| 国产66精品久久久久999小说| 欧美黑人疯狂性受xxxxx野外| 久久久www成人免费精品| 完全免费av在线播放| 国产ts人妖一区二区| 黄色av免费在线播放| 国产一区日韩欧美| 亚洲欧洲精品一区二区| 欧美综合精品| julia一区二区中文久久94| 成人看片网页| 18久久久久久| 欧美1—12sexvideos| 一区二区三区四区视频| 天天干天天草天天射| 欧美剧情片在线观看| 日本高清不卡码| 亚洲一区二区三区四区不卡| 乱h高h女3p含苞待放| 中文字幕欧美国产| av无码av天天av天天爽| 成人av免费在线| 特黄特黄一级片| 极品少妇xxxx精品少妇| 日韩欧美黄色大片| 羞羞答答国产精品www一本| 黄色三级中文字幕| 亚洲精品在线观看91| 日韩av一区二区三区在线观看| 久久久久久亚洲精品美女| 国产日韩欧美在线看| 日本中文字幕一区二区| 日本精品一区二区三区在线播放视频| 9999在线视频| 午夜剧场成人观在线视频免费观看| a级在线观看| 九九久久综合网站| 成人高清免费在线| 久久精品视频一| 国产激情视频在线| 久久最新资源网| 在线播放免费av| 欧美裸体男粗大视频在线观看| 免费日本一区二区三区视频| 最近2019年手机中文字幕| 中文日本在线观看| 色婷婷久久av| 精品欧美色视频网站在线观看| 久久精品中文字幕免费mv| 里番在线观看网站| 久久久精品影院| 污视频在线看网站| 欧美俄罗斯乱妇| 韩国精品一区| 热久久免费视频精品| 日韩欧美一区二区三区在线观看 | 国产精品毛片一区二区在线看舒淇 | 亚洲影院天堂中文av色| 欧美一区二区三区在线播放 | 日本一道在线观看| 欧美韩日精品| 2018日日夜夜| 国产亚洲福利| 亚洲 欧美 另类人妖| 激情亚洲综合在线| 在线观看欧美一区二区| 99久久综合精品| 精品无人区无码乱码毛片国产| 国产精品亲子伦对白| 美女三级黄色片| 亚洲狠狠爱一区二区三区| 久久青青草视频| 欧美日韩一区三区| www.蜜臀av| 国产视频久久久久| 自拍视频在线| 国内成人精品一区| 高清成人在线| 97视频热人人精品| 国产探花在线精品一区二区| 欧美 日韩 国产 在线观看| 一区在线视频观看| 老熟妇仑乱视频一区二区| 久久av资源网| 日本少妇毛茸茸| 国产精品理伦片| 亚欧视频在线观看| 欧美日韩一区二区电影| 亚洲精品国产精品乱码不卡| 欧美日韩另类视频| 国产亚洲久一区二区| 日韩精品在线一区| 国产尤物视频在线| 欧美激情欧美激情在线五月| 成人爽a毛片免费啪啪| 成人午夜在线观看| 你微笑时很美电视剧整集高清不卡| 宅男在线精品国产免费观看| 99在线精品视频在线观看 | 国产成人av福利| 欧美色图亚洲激情| 亚洲精品日日夜夜| av手机天堂网| 亚洲成人aaa| 麻豆网站视频在线观看| 欧美中文字幕在线| 日韩亚洲精品在线观看| 日本一区二区三区精品视频| 欧美三级特黄| 亚洲综合欧美激情| 2019国产精品| 免费一级全黄少妇性色生活片| 欧美吻胸吃奶大尺度电影 | 中文字幕日韩欧美| 国产在线观看www| 99久久一区三区四区免费| 日韩情爱电影在线观看| 日韩在线xxx| av电影一区二区| 久久无码精品丰满人妻| 欧美久久久久久久久| 爱久久·www| 热久久这里只有精品| 国内精品国产成人国产三级粉色| 免费成人深夜夜行网站视频| 日日夜夜免费精品| 黄色录像a级片| 亚洲成人一二三| 东京干手机福利视频| 九九热最新视频//这里只有精品| 欧美美女福利视频| 先锋影音欧美| 麻豆91精品91久久久的内涵| 亚洲色成人网站www永久四虎| 日韩欧美999| 涩涩视频在线观看免费| 992tv成人免费视频| 红杏视频成人| 免费毛片小视频| 91丨九色丨国产丨porny| 日韩手机在线观看| 亚洲国产91精品在线观看| 1区2区3区在线| 鲁片一区二区三区| 亚洲神马久久| 国产精品无码久久久久久| 日韩欧美国产视频| 蜜芽tv福利在线视频| 国产精品超碰97尤物18| 中文字幕日韩精品久久| 久久成人免费电影| 老熟妻内射精品一区| 日韩一区和二区| 毛片在线导航| 黑人巨大精品欧美一区二区小视频| 国产综合网站| 99精品一区二区三区无码吞精| 亚洲电影一级黄| 无码精品人妻一区二区三区影院| 91精品国产91久久久| 亚洲第一福利专区| 999香蕉视频| 国产精品电影一区二区三区| 国产又粗又长视频| 久国内精品在线| 欧美三级午夜理伦三级小说| 成人免费观看视频在线观看| 中文字幕不卡三区| 国产精品乱码久久久| 国模叶桐国产精品一区| 在线日本制服中文欧美| 天天干天天操天天玩| 亚洲精品视频一区| 五月婷婷狠狠干| 国产精品久久久久久久7电影| 国产精品久久天天影视| 亚洲911精品成人18网站| 欧美日韩中文字幕| 在线免费观看的av网站| 高清不卡日本v二区在线| 国产欧美高清| 四虎国产成人精品免费一女五男| 3751色影院一区二区三区| av免费不卡| 日韩免费av一区二区三区| 国产伦精品一区二区三区免费| 久久精品国产亚洲AV无码麻豆| 亚洲毛片在线免费观看| www久久久| 男人日女人下面视频| 亚洲欧洲一区二区三区| 涩涩视频免费看| 国产在线精品一区免费香蕉| 在线视频日韩| 翔田千里88av中文字幕| 亚洲男人av在线| 亚洲午夜免费| 国产福利影院在线观看| 亚洲动漫第一页|