第12章 動態(tài)內(nèi)存

  • 生存期
    • 全局對象:程序啟動時分配无蜂,程序結(jié)束時銷毀
    • 局部對象:進入其定義所在的程序塊時被創(chuàng)建,離開塊時被銷毀
    • static對象:第一次使用前被分配,程序結(jié)束時銷毀
    • 動態(tài)分配的對象:只有當顯式地被釋放時柜候,才會被銷毀
  • 程序內(nèi)存:
    • 靜態(tài)內(nèi)存:局部static對象搞动,類static數(shù)據(jù)成員,定義在任何函數(shù)外的變量→使用前分配內(nèi)存改橘,程序結(jié)束時銷毀滋尉;
      • 局部static對象:令局部變量的聲明周期貫穿函數(shù)調(diào)用及之后的時間,在程序執(zhí)行路徑第一次經(jīng)過對象定義語句時初始化飞主,知道程序終止被銷毀
    • 棧內(nèi)存:定義在函數(shù)內(nèi)的非static對象→僅在其定義的程序塊運行時存在狮惜;
      • 分配在靜態(tài)或者棧內(nèi)存中的對象由編譯器自動創(chuàng)建和銷毀
    • 動態(tài)內(nèi)存:動態(tài)分配,生存期由程序控制→顯示創(chuàng)建碌识,顯示銷毀碾篡。
  • 動態(tài)內(nèi)存:
    • new創(chuàng)建,delete銷毀→確保正確釋放內(nèi)存困難筏餐。
    • (c++11)智能指針:shared_ptr 允許多個指針指向同一對象开泽,unique_ptr 不允許...., weak_ptr 伴隨類魁瞪?穆律,弱引用?导俘,指向shared_ptr指向的對象峦耘。→memory頭文件中
  • 使用動態(tài)生存期的資源:
    • 程序不知道自己需要多少對象旅薄;
    • 程序不知道所需對象的準確類型辅髓;
    • 程序需要在多個對象間共享數(shù)據(jù)。

零少梁、術語表

一洛口、動態(tài)內(nèi)存和智能指針

  1. shared_ptr類
  • 模板類→創(chuàng)建:shared_ptr<string> p1; shared_ptr<list<int>> p2;

  • 初始化:

    • 默認初始化→保存空指針;
    • 其他方式凯沪?(12.1.3)
  • 操作:
    shared_ptr和unique_ptr共有:shared_ptr<T> sp第焰;p;*p妨马;p->mem樟遣;p.get()?身笤; swap(p,q);p.swap(q)
    shared_ptr 獨有:make_shared<T> (args)葵陵;shared_ptr<T> p(q)液荸;p=q;p.unique()脱篙;p.use _count()

  • make_shared函數(shù)

    • 最安全的分配和使用動態(tài)內(nèi)存的方法娇钱,memory頭文件伤柄;
    • 類似順序容器的emplace成員,用其參數(shù)來構造給定類型的對象文搂;
      eg. shared_ptr<int> p1 = make_shared<int>(42);
      shared_ptr<string> p2 = make_shared<string>(10,'9');
    • 不傳遞參數(shù)時→值初始化适刀;
  • shared_ptr的工作原理:

    • 可認為每個shared_ptr都有一個關聯(lián)的計數(shù)器(引用計數(shù));
    • 一旦計數(shù)器變?yōu)?煤蹭,會自動釋放所管理的對象→通過析構函數(shù)銷毀笔喉, - shared_ptr的析構函數(shù) 遞減它指向?qū)ο蟮囊糜嫈?shù)/計數(shù)為0時釋放內(nèi)存;
    • 計數(shù)器:
      • 拷貝→計數(shù)器遞增硝皂;
      • 賦值p = q → p指向?qū)ο笥嫈?shù)遞減常挚,q指向?qū)ο笥嫈?shù)遞增;
      • 返回p→ 需要向調(diào)用者傳遞一個p的拷貝稽物,計數(shù)遞增奄毡。
      • shared_ptr被銷毀,例如一個局部的shared_ptr離開其作用域→計數(shù)器遞減
    • 由于在最后一個shared_ptr銷毀前內(nèi)存都不會釋放贝或,所以需要保證shared_ptr在無用之后不再保留吼过;
  • 回顧知識點:
    基于const的重載→通過區(qū)分成員函數(shù)是否是const對其重載,分別適用于常量版本和非常量版本的對象咪奖。
    initializer_list→6.2.6

  1. 直接管理內(nèi)存
  • 使用new分配和初始化對象:new無法為分配的對象命名盗忱,而是返回一個指向該對象的指針:int *pi = new int;
  • 初始化:
    • 默認初始化→默認狀況下使用,(內(nèi)置類型或組合類型對象的值未定義赡艰,類類型用默認構造函數(shù))售淡;
      • 定義變量時沒有指定初值,則變量被默認初始化慷垮;
      • 內(nèi)置類型揖闸,定義于任何函數(shù)體之外被初始化為0,否則不被初始化料身,值是未定義的→建議初始化每一個內(nèi)置類型的變量
    • 直接初始化→圓括號汤纸,int *pi = new int(1024), string *s = new string(10,'9');
    • 列表初始化 vector<int> *p = new vector<int>{0,1,2,3,4,5}
    • 值初始化:→int *p = new int()芹血;
      • 內(nèi)置類型贮泞,初始值設為0
      • 其余類型,默認初始化
  • 可以用new分配const對象:const int *pci = new const int(1024)→該對象必須初始化幔烛。
  • 使用delete釋放內(nèi)存:接受一個指向想要釋放對象的指針:delete p啃擦,p必須指向一個動態(tài)分配的對象或空指針!饿悬,動態(tài)分配的const對象不可被改變但可被銷毀令蛉。
    • 執(zhí)行兩個動作:銷毀給定指針指向的對象,釋放對應的內(nèi)存。
    • 指向動態(tài)對象的指針必需記得在不用時釋放內(nèi)存珠叔,eg蝎宇,當一個指針離開其作用域,它指向的對象什么都不會發(fā)生祷安,如果是一個指向動態(tài)對象的指針姥芥,那么內(nèi)存將不被釋放。
  • new,delete使用常見問題
    • 忘記delete內(nèi)存汇鞭;
    • 使用已經(jīng)釋放掉的對象凉唐;
    • 同一塊內(nèi)存釋放兩次;
  • 空懸指針:指向一塊曾經(jīng)保存數(shù)據(jù)對象虱咧,但現(xiàn)在已經(jīng)無效的內(nèi)存的指針熊榛,如:int *p = new int(43); auto q = p; delete p;→q現(xiàn)在是一個空懸指針腕巡。
  1. shared_ptr和new結(jié)合使用

  2. unique_ptr

  3. weak_ptr

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末玄坦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子绘沉,更是在濱河造成了極大的恐慌煎楣,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件车伞,死亡現(xiàn)場離奇詭異择懂,居然都是意外死亡,警方通過查閱死者的電腦和手機另玖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門困曙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人谦去,你說我怎么就攤上這事慷丽。” “怎么了鳄哭?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵要糊,是天一觀的道長。 經(jīng)常有香客問我妆丘,道長锄俄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任勺拣,我火速辦了婚禮奶赠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘药有。我一直安慰自己车柠,他們只是感情好,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著竹祷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪羊苟。 梳的紋絲不亂的頭發(fā)上塑陵,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音蜡励,去河邊找鬼令花。 笑死,一個胖子當著我的面吹牛凉倚,可吹牛的內(nèi)容都是我干的兼都。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼稽寒,長吁一口氣:“原來是場噩夢啊……” “哼扮碧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起杏糙,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤慎王,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后宏侍,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赖淤,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年谅河,在試婚紗的時候發(fā)現(xiàn)自己被綠了咱旱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡绷耍,死狀恐怖吐限,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锨天,我是刑警寧澤毯盈,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站病袄,受9級特大地震影響搂赋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜益缠,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一脑奠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧幅慌,春花似錦宋欺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽酸休。三九已至,卻和暖如春祷杈,著一層夾襖步出監(jiān)牢的瞬間斑司,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工但汞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宿刮,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓私蕾,卻偏偏與公主長得像僵缺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子踩叭,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 12.1 智能指針 智能指針行為類似普通指針磕潮,但它負責自動釋放所知的對象。 #include <memory> s...
    龍遁流閱讀 362評論 0 1
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,518評論 1 51
  • 內(nèi)存管理 C++使用new和delete兩個運算符進行內(nèi)存管理懊纳。 使用new進行動態(tài)分配和初始化對象 在自由空間內(nèi)...
    plantom閱讀 345評論 0 1
  • 1. 什么是智能指針揉抵? 智能指針是行為類似于指針的類對象,但這種對象還有其他功能嗤疯。 2. 為什么設計智能指針冤今? 引...
    MinoyJet閱讀 638評論 0 1
  • 人這輩子就是為了一個情。 年少茂缚,我們重視友情戏罢,因為友情讓我們快樂;青春脚囊,我們忠實愛情龟糕,因為愛情讓我們幸福;人成熟了...
    愛粉閱讀 292評論 6 7