智慧型指標是基於raii機制實現的類(模板),具有指標的行為(過載了operator*與operator->操作符),可以「智慧型」地銷毀其所指物件。c++11中有unique_ptr、shared_ptr與weak_ptr等智慧型指標,可以對動態資源進行管理
unique_ptr「唯一」擁有其所指物件,同一時刻只能有乙個unique_ptr指向給定物件(通過禁止拷貝語義、只有移動語義來實現)。
unique_ptr指標本身的生命週期:從unique_ptr指標建立時開始,直到離開作用域。離開作用域時,若其指向物件,則將其所指物件銷毀(預設使用delete操作符,使用者可指定其他操作)。
unique_ptr指標與其所指物件的關係:在智慧型指標生命週期內,可以改變智慧型指標所指物件,如建立智慧型指標時通過建構函式指定、通過reset方法重新指定、通過release方法釋放所有權、通過移動語義轉移所有權。
[cpp]view plain
copy
//智慧型指標的建立
unique_ptr> u_i;
//建立「
空智能指標」
u_i.reset(new
int(3));
//"繫結」動態物件
unique_ptr> u_i2(
newint
(4));
//建立時指定動態物件
//所有權的變化
int*p_i = u_i2.release();
//釋放所有權
unique_ptru_s(new
string(
"abc"
));
unique_ptru_s2 = std::move(u_s); //所有權轉移(通過移動語義),u_s所有權轉移後,變成「空指標」
u_s2=nullptr;//顯式銷毀所指物件,同時智慧型指標變為空指標。與u_s2.reset()等價
(1) 動態資源的異常安全保證(利用其raii特性):
[cpp]view plain
copy
void
foo()
[cpp]view plain
copy
void
foo()
(2) 返回函式內建立的動態資源
[cpp]view plain
copy
unique_ptrfoo()
(3) 可放在容器中(彌補了auto_ptr不能作為容器元素的缺點)
方式一:
[cpp]view plain
copy
vector> vs ,
newstring };
方式二:
[cpp]view plain
copy
vector>v;
unique_ptrp1(new
string(
"abc"
));
v.push_back(std::move(p1));//這裡需要顯式的移動語義,因為unique_ptr並無copy語義
(4) 管理動態陣列,因為unique_ptr有unique_ptr過載版本,銷毀動態物件時呼叫delete
[cpp]view plain
copy
unique_ptr<
int> p (
newint
[3]);
unique_ptr預設的資源刪除操作是delete/delete,若需要,可以進行自定義:
[cpp]view plain
copy
void
end_connection(connection *p)
//資源清理函式
unique_ptr//資源清理器的「型別」
p(&c, end_connection);// 傳入函式名,會自動轉換為函式指標
在c++11環境下,auto_ptr被看做「遺留的」,他們有如下區別:
auto_ptr有拷貝語義,拷貝後源物件變得無效;unique_ptr則無拷貝語義,但提供了移動語義
auto_ptr不可作為容器元素,unique_ptr可以作為容器元素
auto_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...
智慧型指標 unique ptr
unique ptr 是 c 11 提供的用於防止記憶體洩漏的智慧型指標中的一種實現,獨享被管理物件指標所有權的智慧型指標。int main std move是將物件的狀態或者所有權從乙個物件轉移到另乙個物件,只是轉移,沒有記憶體的搬遷或者記憶體拷貝所以可以提高利用效率,改善效能.get函式會返回儲...