c 11智慧型指標的原理 使用

2021-08-22 10:15:07 字數 2503 閱讀 4887

智慧型指標的使用

智慧型指標的實現

raii技術即資源分配及初始化,使用類來封裝資源的分配和初始化,再建構函式完成資源的分配和初始化,析構函式完成資源的清理,可以保證正確的初始化和資源釋放

智慧型指標是借用raii技術對普通指標進行封裝,實質是乙個物件,表現為乙個指標,即智慧型的管理動態資源的釋放。

1.防止忘記呼叫delete操作符釋放資源,與程式異常後進入catch忘記釋放記憶體及多次釋放同一塊記憶體引起的記憶體洩漏

2.將值語義轉為引用語義

1.shared_ptr多個指標指向相同的物件,使用引用計數,每一次shared_ptr的拷貝指向相同的記憶體,每使用一次,內部引用計數加1,每析構一次,內部引用計數減1,直至減為0,自動刪除指向的堆記憶體,shared_ptr內部的引用計數是執行緒安全的,但物件的讀取需要加鎖

2.智慧型指標是乙個模板類,可以指定其型別,傳入的指標使用建構函式初始化,也可使用make_shared函式初始化,不能把乙個指標賦給智慧型指標,因為乙個是類,乙個是指標,如shared_ptr p=new int(1);錯誤

3.拷貝使得物件的引用計數加1,賦值使得原物件的引用計數減1,當計數為0時,自動刪除指向的記憶體,後來指向的物件的引用計數加1,指向後來的物件。

4.缺陷為:迴圈引用,會導致記憶體洩漏問題,解決辦法為使用若引用的智慧型指標,即weak_ptr

#include 

#include

int main()

}

1.unique_ptr唯一擁有其所指物件,在同一時刻只能有乙個unique_ptr指向給定物件(不允許拷貝,賦值操作),與原始指標不同的是,當異常發生時,動態資源得以釋放。

2.unique_ptr本身的生命週期:從unique_ptr指標建立到離開作用域,離開作用域時,若其指向物件,所指物件被銷毀(預設使用delete操作符)

3.unique_ptr指標與所指向物件的關係:建立智慧型指標使用建構函式初始化,使用reset重新指定,使用release釋放所有權,通過移動語義轉移所有權。

#include 

#include

int main()

//超過uptr的作用域,記憶體釋放

}

weak_ptr是配合shared_ptr出現的,不具有普通指標的行為,沒有過載operator*和->最大作用在於協助shared_ptr觀測資源的使用情況,可以從乙個shared_ptr或乙個weak_ptr物件構造,使用其成員函式use_count()獲得觀測資源的引用計數,expired()功能等價於use_count()==0標識被觀測的資源已經不存在。

weak_ptr可以使用lock()獲得乙個新的shared_ptr物件,從而操作資源,但expired()==true時,lock函式返回乙個儲存空指標的shared_ptr物件

#include 

#include

int main()

}//delete memory

}

智慧型指標類將乙個計數器與類指向的物件相關聯,引用計數跟蹤該類有多少個物件共享同一指標。每次建立類的新物件時,初始化指標並將引用計數置為1;當物件作為另一物件的副本而建立時,拷貝建構函式拷貝指標並增加與之相應的引用計數;對乙個物件進行賦值時,賦值操作符減少左運算元所指物件的引用計數(如果引用計數為減至0,則刪除物件),並增加右運算元所指物件的引用計數;呼叫析構函式時,建構函式減少引用計數(如果引用計數減至0,則刪除基礎物件)。智慧型指標就是模擬指標動作的類。所有的智慧型指標都會過載 -> 和 * 操作符。智慧型指標還有許多其他功能,比較有用的是自動銷毀。這主要是利用棧物件的有限作用域以及臨時物件(有限作用域實現)析構函式釋放記憶體。

#include 

#include

template

class smartpointer else

}smartpointer(const smartpointer& ptr)

}smartpointer& operator=(const smartpointer& ptr)

if (this->_ptr)

}this->_ptr = ptr._ptr;

this->_count = ptr._count;

(*this->_count)++;

return *this;

}t& operator*()

t* operator->()

~smartpointer()

}size_t use_count()

};int main()

//delete operator

}

C 11智慧型指標

本文介紹c 的四種智慧型指標,其中後三種是c 11新增加的,auto ptr已被棄用。要編譯c 11,需要安裝g 4.8 sudo add apt repository ppa ubuntu toolchain r test sudo apt get update sudo apt get inst...

c 11 智慧型指標

如果在程式中使用new從堆 自由儲存區 分配記憶體,等到不需要時,應使用delete將其釋放。c 引入了智慧型指標auto ptr,以幫助自動完成這個過程。c 11摒棄了auto ptr,並新增了三種智慧型指標 unique ptr,shared ptr,weak ptr。一.auto ptr,un...

c 11 智慧型指標

首先來看shared ptr,先貼一小部分vs2013裡的實現 template class shared ptr template class shared ptr public ptr base ty template explicit shared ptr ux px template cla...