banner
Lowerce

Lowerce

github
twitter

C++疑點難點

來自 UP:HexUp
"30 分鐘講明白現代 C++ 最重要的特性之一:智能指針"

類型聲明#

遵循 "右左" 法則
從變量名開始向右看,看完後向左看
不可忽略括號,即一層層括號地看
跳出一層後的外層表示的是內層元素的類型或者內層指針的指向
讀取過程的順序表示後者是前者元素的類型
const 一類的聲明也遵從 "右左" 法則

指針大小#

32 位(Bit)架構和 64 位(Bit)架構
內存的最小單位 1 字節(Byte)=8 Bit
32Bit 程序的指針大小 4 字節
64Bit 程序的指針大小 8 字節
指針大小在本質上由編譯器決定

Lambda 表達式#

又名閉包
結構:
捕獲變量 -> 返回類型 {函數主體}
變量捕獲時不加 & 按值捕獲,加 & 按引用捕獲
[&] 按引用捕獲所有外部變量
[=] 按值捕獲所有外部變量
上述二者可以結合,[&,=N] 除了變量 N 按值捕獲外其他外部變量全部按引用捕獲

裸指針與動態內存分配#

new 用來動態申請內存
delete 用來手動釋放動態申請的內存,否則這部分內存不會被釋放,如果 new 申請的空間為數組,需要使用 delete []
智能指針用來避免手動管理內存可能導致的內存洩漏

shared_ptr#

需要 #include ,屬於 std 命名空間
初始化:
shared_ptr p {make_shared(100)};
shared_ptr p {new int(100)};
shared_ptr p = make_shared(100);
上述幾種方式完全等價
p.use_count () 有多少個指針指向同一 object
p.reset () 重置指針,不再指向原 object;也可以設置參數使其指向新的 object
當指向某一 object 的 shared_ptr 降為 0,這一 object 會自動銷毀
p.get () 獲取指向當前 object 的裸指針
初始化還有一些特殊的參數配置如下:
shared_ptr sfp {fp, close_file}; 第二個參數為自定義的銷毀函數
shared_ptr b (f, &(f->b)); 第二個參數用於訪問類的成員變量

unique_ptr#

庫基礎、初始化方式與 shared_ptr 相同
獨占 object 的管理權,銷毀時自動釋放所綁定的 object
p.release () 會返回 object 的裸指針同時設置 p 為 nullptr
控制權不可拷貝但可轉移
unique_ptr p2 {p1.release()}
unique_ptr p2 {move(p1)}
將 p1 的控制權轉移給 p2,上述兩式等價
unique_ptr<int, decltype (&my_dealloc)> cup {my_alloc (100), my_dealloc} 自定義銷毀函數更加複雜,需要在 <> 內聲明
函數間傳遞時可以使用 * p 直接傳遞值,也可以使用 p.get () 傳遞裸指針,或者將函數的參數設置為 unique_ptr& 即 unique_ptr 的引用,還可以使用 move (p) 來改變 object 的控制權(此時函數的參數為 unique_ptr
函數的返回值沒有額外的限制,可以直接使用 unique_ptr類型的函數返回值初始化 unique_ptr,其本質也是調用 move

weak_ptr#

可以解決環形依賴問題
weak_ptr 依賴 shared_ptr 存在,需要用 shared_ptr 初始化
weak_ptr 只有 object 的觀察權,沒有 object 的管理權
wp.lock () 會返回一個 shared_ptr,若 weak_ptr 所指向的資源已釋放,則返回 nullptr

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。