智能指针——unique_ptr
1. 開篇
unique_ptr(唯一)是一種定義在中的智能指針(smart pointer)。不能進行復制操作只能進行移動操作。
unique是獨特的、唯一的意思,故名思議,unique_ptr可以"獨占"地擁有它所指向的對象,它提供一種嚴格意義上的所有權。
unique_ptr和shared_ptr類型指針有很大的不同: shared_ptr 允許多個指針指向同一對象,而unique_ptr在某一時刻只能有一個指針指向該對象(兩個unique_ptr不能指向同一個對象)。
unique_ptr保存指向某個對象的指針,當它本身被刪除或者離開其作用域時會自動釋放其指向對象所占用的資源。
2. 創(chuàng)建unique_ptr
unique_ptr不像shared_ptr一樣擁有標準庫函數(shù) make_shared來創(chuàng)建一個shared_ptr 實例。要想創(chuàng)建一個unique_ptr,我們需要將一個new操作符返回的指針傳遞給unique_ptr的構造函數(shù)。
int main() {//創(chuàng)建一個unique_ptr實例unique_ptr<int> pInt(new int(5));cout << *pInt; }3. 無法進行復制構造和賦值操作
unique_ptr沒有copy構造函數(shù),不支持普通的拷貝和賦值操作。
int main() {//創(chuàng)建一個unique_ptr實例unique_ptr<int> pInt(new int(5));unique_ptr<int> pInt2(pInt); //報錯unique_ptr<int> pInt3;pInt3 = pInt; //報錯 }4. 可以進行移動構造和移動賦值操作
unique_ptr雖然沒有支持普通的拷貝和賦值操作,但卻提供了一種移動機制來將指針的所有權從一個unique_ptr轉移給另一個unique_ptr。
如果需要轉移所有權,可以使用std::move()函數(shù)。
int main() {unique_ptr<int> pInt(new int(5));unique_ptr<int> pInt2 = std::move(pInt); //轉移所有權//cout << *pInt << endl; //出錯,pInt為空cout << *pInt2 << endl;unique_ptr<int> pInt3(std::move(pInt2)); }5. 可以返回unique_ptr
unique_ptr不支持拷貝操作,但卻有一個例外:可以從函數(shù)中返回一個unique_ptr。
unique_ptr<int> clone(int a) {unique_ptr<int> pInt(new int(a));return pInt; //返回unique_ptr }int main() {int x = 5;unique_ptr<int> reta = clone(x);unique_ptr<int> retb;retb = clone(x);cout << *reta << endl;cout<< *retb<endl;return 0; }6. unique_ptr使用場景
(1) 為動態(tài)申請的資源提供異常安全保證
我們先來看看下面這一段代碼:
這是我們傳統(tǒng)的寫法:當我們動態(tài)申請內存后,有可能我們接下來的代碼由于拋出異常或者提前退出(if語句)而沒有執(zhí)行delete操作。
解決的方法是使用unique_ptr來管理動態(tài)內存,只要unique_ptr指針創(chuàng)建成功,其析構函數(shù)都會被調用。確保動態(tài)資源被釋放。
void func() {unique_ptr<int> pInt(new int(5));// ... (可能會拋出異常) }(2) 返回函數(shù)內動態(tài)申請資源的所有權
示例如下:
(3) 在容器中保存指針
int main() {vector<unique_ptr<int>> vec;unique_ptr<int> pInt(new int(5));vec.push_back(std::move(pInt)); //使用移動語義 }(4) 管理動態(tài)數(shù)組
標準庫提供了一個可以管理動態(tài)數(shù)組的unique_ptr版本。
int main() {unique_ptr<int[]> p(new int[5] {1,2,3,4,5});p[0] = 0; //重載了operator[] }總結
以上是生活随笔為你收集整理的智能指针——unique_ptr的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Linux】库文件
- 下一篇: 智能指针——weak_ptr