動態記憶體與智慧型指標

2021-08-13 10:24:01 字數 1001 閱讀 8262

其中堆區的記憶體是程式設計師手動分配的,在學習智慧型指標之前,我們用裸指標管理這塊記憶體,分配的記憶體使用完畢後必須手動的將它釋放掉,否則會導致記憶體洩漏;若果有兩個指標指向同一塊記憶體,在乙個指標將這塊記憶體釋放掉後,另乙個指標就成了空懸指標,解引用空懸指標會造成不可知的錯誤,過去使用裸指標只能由程式設計師來盡量避免這兩個錯誤。

智慧型指標的設計就是為了解決這樣的問題 

智慧型指標與裸指標的最大不同就是智慧型指標管理它所指記憶體的生命週期,當一塊記憶體不再被需要後,智慧型指標就會自動的釋放它。

智慧型指標分為 shared_ptr(共享指標) 和 unique_ptr(獨佔指標)

弱指標的乙個重要使用場景就是解決共享指標迴圈引用造成的記憶體洩漏。 

考慮下面的一段程式

class a

};int main()

//我們期望在離開這個作用域之後,sp_a1和sp_a2會釋放它們控制的記憶體

system("pause");

return 0;

}//在離開作用域後,程式沒有沒有輸出析構函式中的destructed

//原因是這兩塊記憶體上的共享指標構成了迴圈引用

這幾個指標間構成了乙個死鎖,這兩塊記憶體直到程式結束前都不會被釋放

使用弱指標就可以解決這樣的問題

class a

};

在用new分配記憶體的時候發生了三件事:

申請一塊記憶體

構造記憶體上的物件

返回指向這塊記憶體的指標

同樣在用delete時也會:

執行記憶體上物件的析構函式

釋放這塊記憶體

allocator類的作用就是將 分配/** 記憶體的操作與 構造/析構 物件的操作分開來。

動態記憶體與智慧型指標

動態記憶體與智慧型指標 靜態記憶體用來儲存區域性static物件 類static資料成員以及定義在任何函式之外的變數 全域性變數 棧記憶體用來儲存定義在函式內的非static物件。分配在靜態或棧記憶體中的物件由編譯器自動建立和銷毀。對於棧物件,僅在其定義的程式塊執行時才存在 static物件在使用之...

動態記憶體與智慧型指標

在c 中,動態記憶體的管理是通過一對運算子來完成的 new,在動態記憶體中為物件分配空間並返回乙個指向該物件的指標,我們可以選擇對物件進行初始化 delete,接受乙個動態物件指標,銷毀該物件並釋放與之關聯的記憶體。動態記憶體在使用時很容易出問題,有時會忘記釋放記憶體,造成記憶體洩露,有時在尚有指標...

動態記憶體與智慧型指標

我們先來看一些物件的生存期。全域性物件在程式啟動時分配,在程式結束時銷毀。區域性static物件在第一次使用前分配,在程式結束時銷毀。區域性自動物件,在進入其定義所在的程式塊兒時被建立,離開塊時銷毀。即,它們都是由編譯器自動建立與銷毀。而動態分配的物件的生存期與它們在 建立的無關,只有當顯式地被釋放...