日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

unique_ptr使用介绍

發(fā)布時(shí)間:2025/4/5 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 unique_ptr使用介绍 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 1 unique_ptr使用介紹
      • 1.1 unique_ptr的特性
      • 1.2 unique_ptr常用方法介紹

1 unique_ptr使用介紹

1.1 unique_ptr的特性

我們先來看下unique_ptr的特性:

  • 基于排他所有權(quán)模式:兩個(gè)指針不能指向同一個(gè)資源。
  • 無法進(jìn)行左值unique_ptr復(fù)制構(gòu)造,也無法進(jìn)行左值復(fù)制賦值操作,但允許臨時(shí)右值賦值構(gòu)造和賦值。
  • 保存指向某個(gè)對象的指針,當(dāng)它本身離開作用域時(shí)會(huì)自動(dòng)釋放它指向的對象。
  • 在容器中保存指針是安全的。

示例代碼如下:

#include <stdio.h> #include <iostream> #include <string> #include <memory> #include <vector>using namespace std;int main() {//弊端1. auto_ptr 被C++11 拋棄的主要理由 p1= p2 ,復(fù)制或賦值都會(huì)改變資源的所有權(quán)//unique_ptr 如何解決這個(gè)問題? 不允許顯示的右值賦值和構(gòu)造unique_ptr<string> p1(new string("I 'm martin."));unique_ptr<string> p2(new string("I 'm rock."));printf("p1: %p\n", p1.get());printf("p2: %p\n", p2.get());//如果一定要轉(zhuǎn)移,使用move 把左值轉(zhuǎn)成右值p1 = std::move(p2);printf("p1: %p\n", p1.get());printf("p2: %p\n", p2.get());//p1 = p2; //左值賦值禁止unique_ptr<string> p3(new string("I 'm p3."));unique_ptr<string> p4(std::move(p3)); //左值拷貝構(gòu)造也不行,必須轉(zhuǎn)成右值//弊端2. 在 STL 容器中使用auto_ptr存在重大風(fēng)險(xiǎn),因?yàn)槿萜鲀?nèi)的元素必需支持可復(fù)制(copy constructable)和可賦值(assignable)。vector<unique_ptr<string>> vu;unique_ptr<string> p5(new string("I 'm p5."));unique_ptr<string> p6(new string("I 'm p6."));vu.push_back(std::move(p3));vu.push_back(std::move(p4));cout << "va[0]: " << *vu[0] << endl;cout << "va[1]: " << *vu[1] << endl;//vu[0] = vu[1]; //unique_ptr不支持直接賦值,沒有風(fēng)險(xiǎn)//弊端3. auto_ptr不支持對象數(shù)組的內(nèi)存管理,unique_ptr 支持 //但是unique_ptr 支持對象數(shù)組的管理//auto_ptr<int[]> ai(new int[5]); //不能這樣定義unique_ptr<int[]> ui(new int[5]); //自動(dòng)會(huì)調(diào)用 delete []函數(shù)去釋放system("pause");return 0; }

1.2 unique_ptr常用方法介紹

構(gòu)造函數(shù):

unique_ptr<T> up ; //空的unique_ptr,可以指向類型為T的對象 unique_ptr<T> up1(new T()) ;//定義unique_ptr,同時(shí)指向類型為T的對象 unique_ptr<T[]> up ; //空的unique_ptr,可以指向類型為T[的數(shù)組對象 unique_ptr<T[]> up1(new T[]) ;//定義unique_ptr,同時(shí)指向類型為T的數(shù)組對象 unique_ptr<T,D> up(); //空的unique_ptr,接受一個(gè)D類型的刪除器d,使用d釋放內(nèi)存(可以不傳遞) unique_ptr<T,D> up(new T(), D()); //定義unique_ptr,同時(shí)指向類型為T的對象,接受一個(gè)D類型的刪除器d,使用刪除器d來釋放內(nèi)存

賦值:

unique_ptr<int> up1(new int(10)); unique_ptr<int> up2(new int(11)); up1 = std::move(up2);//必須使用移動(dòng)語義,結(jié)果,up1 內(nèi)存釋放, up2 交由up1 管理

主動(dòng)釋放對象:

up = nullptr ;//釋放up指向的對象,將up置為空 up = NULL; //作用相同

放棄對象控制權(quán):

up.release(); //放棄對象的控制權(quán),返回指針,將up置為空,不會(huì)釋放內(nèi)存

重置:

up.reset()//參數(shù)可以為 空、內(nèi)置指針,先將up所指對象釋放,然后重置up的值交換 up.swap(up1); //將智能指針up 和up1管控的對象進(jìn)行交換

參考資料:

  • C/C++從入門到精通-高級(jí)程序員之路【奇牛學(xué)院】
  • 總結(jié)

    以上是生活随笔為你收集整理的unique_ptr使用介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。