shared_ptr和weak_ptr使用介绍
生活随笔
收集整理的這篇文章主要介紹了
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_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!
參考資料:
總結
以上是生活随笔為你收集整理的shared_ptr和weak_ptr使用介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: unique_ptr使用介绍
- 下一篇: 主流数据库介绍