操作詳解
最近學習了一下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...