//練習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物件在第一次使用前分配,在程式結束時銷毀。區域性自動物件,在進入其定義所在的程式塊兒時被建立,離開塊時銷毀。即,它們都是由編譯器自動建立與銷毀。而動態分配的物件的生存期與它們在 建立的無關,只有當顯式地被釋放...