12 1 動態記憶體與智慧型指標 1

2022-09-04 06:33:11 字數 1271 閱讀 5586

//

練習12.10-11

shared_ptr p(new

int(42

));//

process(p);

//process(shared_ptr(p));

//用p來初始化建立乙個臨時的智慧型指標

//也指向p所指向的記憶體

process(shared_ptr(p.get())); //

用p.get()返回的內建指標來初始化建立乙個

//臨時的智慧型指標,指向p所指向的記憶體

//當離開process函式的作用域時,這個臨時智慧型指標會被銷毀

//其所指向的記憶體也被釋放掉

//因為呼叫結束後指向這塊記憶體的智慧型指標數為0

//導致再次使用這塊記憶體時會得到未定義的結果

int i = *p;

cout

<< i;

//練習12.11的函式

void process(shared_ptrptr)

//

練習12.12

auto p = new

int();

auto sp = make_shared();

process(sp);

//正確

//process(new int());

//錯誤,傳入的是乙個區域性臨時int*內建指標

//process(p);

//錯誤,傳入的是乙個int*內建指標

process(shared_ptr(p)); //

正確,將int*指標強制型別轉換為智慧型指標

//並傳入乙個臨時區域性的智慧型指標

//函式呼叫返回時這個區域性指標會被銷毀

//計數變為0

//其指向的空間也將會被自動釋放

//

練習12.13

auto sp = make_shared(42

);auto p = sp.get

();delete p; //

沒有釋放其所指向的記憶體

//因為仍有智慧型指標sp指向這塊記憶體

//計數為1

cout << sp.use_count()

<< *sp << "

"<< *p;

切忌混用智慧型指標和內建指標,特別是用內建指標初始化智慧型指標,即

int *p = new int(42);

shared_ptrsp(p);

動態記憶體與智慧型指標

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

動態記憶體與智慧型指標

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

動態記憶體與智慧型指標

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