C 智慧型指標知識總結

2021-09-27 04:36:41 字數 1616 閱讀 2583

操作詳解

最近學習了一下c++的智慧型指標,通過正確的使用,智慧型指標能讓動態記憶體管理變得更簡單。

new和delete是傳統的管理動態記憶體的方式,直接管理記憶體,其管理的內存在被delete顯示釋放之前一直存在,這裡記錄一些我自己較少見到的東西:

const int *p=new const int(1024);	//動態分配常量,必須初始化
直接使用new和delete容易出現很多問題,常見的問題有三種:

忘記delete記憶體

使用已經釋放的記憶體

同一記憶體釋放兩次

主要使用的有shared_ptr,unique_ptr,weak_ptr,這三種型別都定義在標頭檔案memory中,不同的智慧型指標有不同的適用場景,這次我們來討論shared_ptr,shared_ptr適用於用多個指標指向同乙個記憶體塊,在share_ptr中存在一種「引用計數」的方法,當shared_ptr的引用計數為0時,他便會將管理的記憶體自動釋放掉。

我們可以認為每個shared_ptr都可以關聯到某乙個計數器,當多個智慧型指標共同管理乙個記憶體時,可以認為他們被關聯到同乙個計數器上,當其中某一指標被拷貝,作為引數或返回值時,計數器遞增,當某一指標被賦值或因離開作用域而銷毀時,計數器遞減,當計數器遞減到0時,這塊記憶體便被自動釋放。例子如下:

auto p=make_shared(42);

auto r=make_shared(35);

r=q;//r所關聯的計數器遞減,q所關聯的計數器遞增,由於r所管理的原記憶體無其他關聯的智慧型指標,引用計數變為0,原記憶體被釋放

由於這個特性,我們必須保證,當乙個shared_ptr不再使用時必須被銷毀。

智慧型指標也是模板,宣告例子如下:

shared_ptrp1;

shared_ptr> p2;//還可指向容器

預設初始化的智慧型指標儲存乙個空指標。

將智慧型指標作為乙個判斷條件,如:

if(p1)

若p1指向乙個物件,則結果為true,否則為false。

p1.get();
獲取智慧型指標p1中儲存的指標,使用這個方法時要特別注意,具體細節稍後說明。

shared_ptrp=make_shared(argumemt);	//返回乙個用argument建立的智慧型指標

shared_ptrp(q); //此操作將遞增q的引用計數,遞減p的引用計數

p.use_count(); //返回與p共享同一記憶體塊的智慧型指標數量

p.unique(); //若乙個記憶體塊僅有該智慧型指標p管理,則返回true,否則返回false

最安全的分配動態記憶體的方式是使用make_shared函式。用法如下:

shared_ptrp1=make_shared(42);

auto p2=make_shared>();//更為常見的做法

shared_ptrp1(new int (1024));

shared_ptrp1=new int(1024); //這是錯誤的,智慧型指標與普通指標不可隱式轉換

C 智慧型指標總結

智慧型指標raii 資源分配及初始化,定義乙個類來封裝資源的分配和初始化,在建構函式完成資源的分配和初始化,在析構函式完成資源的清理,可以保證資源的正確初始化和釋放 pragma once autoptr 智慧型指標 template class t class autoptr 拷貝構造 把ap1股...

智慧型指標總結

1.智慧型指標的原理 1 智慧型指標不是通常意義下的指標,而是乙個模板類,在對模板類例項化之後會產生類似於指標的行為。通過物件來管理資源。2 智慧型指標採用一種raii 資源分配即初始化 機制,在建構函式中實現對資源的分配及初始化,在析構函式中實現對資源的析構及 2.智慧型指標的分類 c 中最開始是...

智慧型指標總結

std shared ptr include class test public std enable shared from this void print intid int main std enable shared from this是乙個模板類,其中有乙個成員函式 shared ptrs...