1、與shared_ptr不同。某個時刻只能有乙個unique_ptr指向乙個給定物件。當unique_ptr被銷毀時,它所指向的物件也被銷毀。
2、unique_ptr初始化必須採用直接初始化的的形式:unique_ptrp1; //指向乙個double型別的unique_ptr
unique_ptrp2 (new int (42)); //p2指向乙個值為42的int
3、unique_ptr擁有它所指向的物件,因此unique_ptr不支援普通的拷貝和賦值:
unique_ptrp1(new string("hello world"));
unique_ptrp2(p1)//錯誤,不支援拷貝
unique_ptrp3;
p3 = p2 ; //錯誤,不支援賦值
4、不能普通拷貝、但可以通過release或reset將指標的所有權從乙個(非const)unique_ptr轉移給另乙個unique
unique_ptrp1(new string("hello world"));
uniquep2(p1.release());//p1所有權轉移到了p2
uniquep3(new string("hello"));
p2.reset(p3.release());//將所有權從p3轉移給p2。reset釋放了p2原來指向的記憶體
5、unique_ptr常用操作:
unique_ptru1 //空unique_ptr,可以指向型別為t的物件。
unique_ptru2 //釋放指標,u2會使用乙個型別為d的庫呼叫物件來釋放指標
unique_ptru(d) //空unique_ptr,指向型別為t的物件,用型別為d的物件來代替delete
u=nullptr ; //釋放u指向的物件、u置空
u.release()//u放棄對指標的控制權。返回指標並將u置空
u.reset() //釋放u指向的物件、
u.reset(q) //如果提供了內建指標q,令u指向這個物件;否則將u置為空
u.reset(nullptr)
6、注意release返回的指標通常被用來初始化另乙個智慧型指標或給另乙個智慧型指標賦值。
p2.release() //錯誤,p2不會釋放記憶體,丟失了指標
auto p = p2.release() //正確,但是需要delete(p)
7、 auto_ptr具有unique_ptr的部分特性,但不是全部。特別是不能在容器中儲存auto_ptr,也不能從函式中返回auto_ptr
8、weak_ptr 是一種不控制所指向物件生存期的智慧型指標,它指向乙個shared_ptr管理的物件。
將乙個weak_ptr繫結到乙個shared_ptr不會改變shared_ptr的引用計數,一旦最後乙個指向物件的shared_ptr被銷毀,物件就會被釋放
即使有weak_ptr指向物件,也會被釋放。
auto p = make_shared(42)
weak_ptrwp(p);//p的引用 計數未改變
9、weak_ptr常用 操作
weak_ptrw //空weak_ptr指向型別為t的物件
weak_ptrw(sp)//weak_ptr w與shared_ptr sp指向相同的對像
w=p //p可以是乙個shared_ptr或乙個weak_ptr
w.reset() //將w置空
w.use_count()//與w共享物件的shared_ptr的數量
w.expired()//若w.use_count()為0返回true
w.lock() //如果expired為true,返回乙個空shared_ptr.;否則返回乙個指向w的物件的shared_ptr
c 智慧型指標 unique ptr
智慧型指標是基於raii機制實現的類 模板 具有指標的行為 過載了operator 與operator 操作符 可以 智慧型 地銷毀其所指物件。c 11中有unique ptr shared ptr與weak ptr等智慧型指標,可以對動態資源進行管理 unique ptr 唯一 擁有其所指物件,同...
C 智慧型指標 unique ptr
unique ptr 唯一 擁有其所指物件,同一時刻只能有乙個unique ptr指向給定物件 通過禁止拷貝語義 只有移動語義來實現 unique ptr指標本身的生命週期 從unique ptr指標建立時開始,直到離開作用域。離開作用域時,若其指向物件,則將其所指物件銷毀 預設使用delete操作...
C 智慧型指標 unique ptr
unique ptr和auto ptr類似。但是unique ptr擁有它指向的物件。某個時刻只能有乙個unique ptr指向乙個給定物件。當unique ptr被銷毀時,它所指向的物件也被銷毀。必須採用直接初始化形式 不能呼叫賦值或拷貝建構函式,避免了兩個指標指向同一塊位址的問題,避免了auto...