reference counting,引用計數
auto_ptr
p1(new
string("auto"));
auto_ptr
p2;
p2 = p1; // p1 lose ownership
cout
<< p1; // 系統報錯,p1不再指向有效資料
unique_ptr p3(new
string("unique"));
unique_ptr p4;
p4 = p3; // 編譯階段直接報錯,因此更加安全
// 定義乙個demo函式,返回右值臨時變數
unique_ptr demo(const
char* s)
// 返回的temp時乙個臨時右值變數,讓出所有權之後立即被銷毀
unique_ptr ps;
ps = demo("uniquely special") // 合法
pu = unique_ptr(new
string
"yo!") // 合法
ps1 = demo("uniquely special");
ps2 = move(ps1);
ps1 = demo(" and more");
cout
<< *ps2 << *ps1 << endl;
// unique_ptr由使用 new 和 delete 的版本,而auto_ptr沒有
std::unique_ptrpda(new
double(5));
語法
操作內容
unique_ptru1
空智能指標u1
,可指向型別為t的物件,使用delete
釋放記憶體
unique_ptru2
空智能指標u1
,可指向型別為t的物件,使用乙個d型別的可呼叫物件來釋放記憶體
unique_ptru2(d)
空智能指標u1
,可指向型別為t的物件,呼叫d型別的物件d來釋放記憶體
u = nullptr
釋放u
指向的物件,將u
置空
u.release()
返回u
內部的普通指標,放棄對它的所有權,將u
置空
u.reset()
釋放u
指向的物件
u.reset(q)
將u
指向q
u.reset(nullptr)
將u
置空
最安全的分配和使用動態記憶體的方法是呼叫乙個名為make_shared
的標準庫函式。此函式在動態記憶體分配中分配乙個物件並初始化它,返回指向此物件的
shared_ptr
。此函式定義在標頭檔案
memory
中。
// 指向乙個值為42的int
shared_ptr
p3 = make_shared(42);
// 指向乙個值為"9999999999"的string
shared_ptr
p4 = make_shared(10, '9');
// 指向乙個動態分配的vector
auto p5 = make_shared>();
語法
操作內容
make_shared(args)
返回乙個shared_ptr
,它指向動態分配的t
型別物件,並用args
初始化
shared_ptrp(q)
使p
作為q
的拷貝,q
的引用計數+1
p = q
p
的引用計數-1,q
的引用計數+1
p.unique()
若p
的引用計數=1,則返回true
p.use_count()
返回與p
共享物件的智慧型指標的數量 語法
操作內容
shared_ptr
空智能指標,可指向型別為t的物件
unique_ptr
空智能指標,可指向型別為t的物件
p
p非空為true
*p
解引用p,獲得它指向的物件
p->mem
=(*p).mem
p.get()
返回智慧型指標p中儲存的普通指標
swap(p, q)
或p.swap(q)
交換智慧型指標p和q中的普通指標
動態記憶體與智慧型指標
動態記憶體與智慧型指標 靜態記憶體用來儲存區域性static物件 類static資料成員以及定義在任何函式之外的變數 全域性變數 棧記憶體用來儲存定義在函式內的非static物件。分配在靜態或棧記憶體中的物件由編譯器自動建立和銷毀。對於棧物件,僅在其定義的程式塊執行時才存在 static物件在使用之...
動態記憶體與智慧型指標
在c 中,動態記憶體的管理是通過一對運算子來完成的 new,在動態記憶體中為物件分配空間並返回乙個指向該物件的指標,我們可以選擇對物件進行初始化 delete,接受乙個動態物件指標,銷毀該物件並釋放與之關聯的記憶體。動態記憶體在使用時很容易出問題,有時會忘記釋放記憶體,造成記憶體洩露,有時在尚有指標...
動態記憶體與智慧型指標
我們先來看一些物件的生存期。全域性物件在程式啟動時分配,在程式結束時銷毀。區域性static物件在第一次使用前分配,在程式結束時銷毀。區域性自動物件,在進入其定義所在的程式塊兒時被建立,離開塊時銷毀。即,它們都是由編譯器自動建立與銷毀。而動態分配的物件的生存期與它們在 建立的無關,只有當顯式地被釋放...