動態記憶體與智慧型指標

2021-07-02 07:07:59 字數 1583 閱讀 8099

動態記憶體與智慧型指標

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

除了靜態記憶體和棧記憶體,每個程式還擁有乙個記憶體池。這部分記憶體被稱為自由空間或(heap)。用來儲存動態分配的物件,即那些在程式執行時分配的物件。當動態記憶體不使用時,我們的**必須顯示地銷毀它們。

新標準提供了兩種智慧型指標(smart pointer)來管理動態物件。與常規指標的區別是,他們負責自動釋放所指向的物件。shared_ptr允許多個指標指向同乙個物件;unique_ptr則獨佔所指向的物件。

shared_ptr類

make_shared函式

最安全的分配和使用動態記憶體的方式是呼叫乙個名為make_shared的標準庫函式。此函式在動態記憶體中分配乙個物件並初始化它,返回指向此物件的shared_ptr。

shared_ptr p3 = make_shared(42);

當然我們通常使用auto定義乙個物件來儲存make_shared

shared_ptr的拷貝和賦值

我們可以認為每個shared_ptr都有乙個關聯的計數器,通常稱其為引用計數(reference count)。無論何時我們拷貝乙個shared_ptr,計數器都會增加。

當用乙個shared_ptr初始化另乙個shared_ptr,或將它作為引數傳遞給乙個函式,或作為函式的返回值,它所關聯的計數器就會遞增。

但我們給shared_ptr賦予乙個新值或者shared_ptr被銷毀(例如乙個區域性的shared_ptr離開其作用域)計數器就會遞減。

shared_ptr自動銷毀所管理的物件,還會自動釋放相關聯的記憶體。

//factory返回乙個shared_ptr,指向乙個動態分配的物件

shared_ptr

factory(t arg)

void ues_factory(t arg)

//p離開了作用域,它指向的記憶體會被自動釋放掉

在此例中p是use_factory的區域性變數,在use_factory結束時將被銷毀。當p被銷毀時,將遞減其引用計數並檢查它是否為0。在此例中,p是唯一引用factory返回的記憶體的物件的。由於p將被銷毀,p指的這個物件也會被銷毀,所占用的記憶體會被釋放。

shared_ptr和unique_ptr公有的一些操作

p.get() 返回p中儲存的指標,若智慧型指標釋放了其物件,返回的指標所指向的物件也就消失了

p.reset() p.reset(q) p.reset(q,d) 若p是唯一指向其物件的shared_ptr,reset會釋放此物件。若傳遞了可選的引數內建指標q,會令p指向q,否則將p置為空。若還傳遞了d,使用d而不是delete來釋放q

動態記憶體與智慧型指標

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

動態記憶體與智慧型指標

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

動態記憶體與智慧型指標

智慧型指標與常規指標的區別在於它自動釋放所指向的物件。shared ptr 允許多個指標指向同乙個物件 unique ptr 獨佔 所指向的物件。weak ptr 伴隨類,弱引用,指向shared ptr所管理的物件。定義,與vector類似,智慧型指標也是模板 shared ptr p1 shar...