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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

shared_ptr和weak_ptr使用介绍

發布時間:2025/4/5 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 shared_ptr和weak_ptr使用介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1 shared_ptr使用介紹
      • 1.1 shared_ptr使用介紹
      • 1.2 shared_ptr的使用陷阱
    • 2 weak_ptr使用簡介

1 shared_ptr使用介紹

1.1 shared_ptr使用介紹

熟悉了unique_ptr 后,其實我們發現unique_ptr 這種排他型的內存管理并不能適應所有情況,有很大的局限!如果需要多個指針變量共享怎么辦?

如果有一種方式,可以記錄引用特定內存對象的智能指針數量,當復制或拷貝時,引用計數加1,當智能指針析構時,引用計數減1,如果計數為零,代表已經沒有指針指向這塊內存,那么我們就釋放它!這就是 shared_ptr 采用的策略!


構造函數:

shared_ptr<T> sp ; //空的shared_ptr,可以指向類型為T的對象 shared_ptr<T> sp1(new T()) ;//定義shared_ptr,同時指向類型為T的對象 shared_ptr<T[]> sp2 ; //空的shared_ptr,可以指向類型為T[的數組對象 C++17后支持 shared_ptr<T[]> sp3(new T[]{...}) ;//指向類型為T的數組對象 C++17后支持 shared_ptr<T> sp4(NULL, D()); //空的shared_ptr,接受一個D類型的刪除器,使用D釋放內存 shared_ptr<T> sp5(new T(), D()); //定義shared_ptr,指向類型為T的對象,接受一個D類型的刪除器,使用D刪除器來釋放內存

初始化:

// 方式一 構造函數 shared_ptrr<int> up1(new int(10)); //int(10) 的引用計數為1 shared_ptrr<int> up2(up1); //使用智能指針up1構造up2, 此時int(10) 引用計數為2// 方式二 使用make_shared 初始化對象,分配內存效率更高make_shared函數的主要功能是在動態內存中分配一個對象并初始化它,返回指向此對象的shared_ptr; 用法:make_shared<類型>(構造類型對象需要的參數列表); shared_ptr<int> p4 = make_shared<int>(2); //多個參數以逗號','隔開,最多接受十個 shared_ptr<string> p4 = make_shared<string>("字符串");

賦值:

shared_ptrr<int> up1(new int(10)); //int(10) 的引用計數為1 shared_ptr<int> up2(new int(11)); //int(11) 的引用計數為1 up1 = up2;//int(10) 的引用計數減1,計數歸零內存釋放,up2共享int(11)給up1, int(11)的引用計數為2

主動釋放對象:

shared_ptrr<int> up1(new int(10)); up1 = nullptr ;//int(10) 的引用計數減1,計數歸零內存釋放 up1 = NULL; //作用同上

重置:

up.reset() ; //將p重置為空指針,所管理對象引用計數減1 up.reset(p1); //將p重置為p1(的值),p 管控的對象計數減1,p接管對p1指針的管控 up.reset(p1,d); //將p重置為p(的值),p 管控的對象計數減1并使用d作為刪除器

交換:

std::swap(p1,p2); //交換p1 和p2 管理的對象,原對象的引用計數不變 p1.swap(p2); //同上

1.2 shared_ptr的使用陷阱

shared_ptr作為被管控的對象的成員時,小心因循環引用造成無法釋放資源!

示例代碼如下:

#include <stdio.h> #include <iostream> #include <string> #include <memory> #include <vector>using namespace std;class girl;class boy { public:boy() {cout << "boy construct!" << endl;}~boy() {cout << "boy destruct!" << endl;}void set_girl_friend(shared_ptr<girl> &g) {girl_friend = g;} private:shared_ptr<girl> girl_friend; };class girl { public:girl() {cout << "girl construct!" << endl;}~girl() {cout << "girl destruct!" << endl;}void set_boy_friend(shared_ptr<boy> &b) {boy_friend = b;} private:shared_ptr<boy> boy_friend; };void use_trap() {shared_ptr<girl> sp_girl(new girl());//白娘子shared_ptr<boy> sp_boy(new boy()); //許仙sp_girl->set_boy_friend(sp_boy);sp_boy->set_girl_friend(sp_girl);}int main() {use_trap();system("pause");return 0; }

2 weak_ptr使用簡介

weak_ptr 設計的目的是為配合 shared_ptr 而引入的一種智能指針來協助 shared_ptr 工作, 它只可以從一個 shared_ptr 或另一個 weak_ptr 對象構造, 它的構造和析構不會引起引用記數的增加或減少。同時weak_ptr 沒有重載*和->,但可以使用 lock 獲得一個可用的 shared_ptr 對象(引用計數會增加1)。

一般情況下我們無需使用weak_ptr,只有在特殊的情況下才需要使用weak_ptr!


參考資料:

  • C/C++從入門到精通-高級程序員之路【奇牛學院】
  • 總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。