C++資源管理操作方法詳解
以對象管理資源
class A{...}; //工廠函數(shù)createA來提供特定的A對象 A* createA(); //壞情況 void f(){ A* p=createA(); ... delete p;//如何在delete之前程序先return了,則無法delete } //為了確保資源釋放 將資源放進對象內 利用對象的析構函數(shù)來釋放 void f(){ std::shared_ptr<A> p(createA()); ... //程序結束后會經shared_ptr的析構函數(shù)釋放 }
auto_ptr已經被廢除,主要原因是其拷貝會造成所以權轉移,所以使用shared_ptr更好
以對象管理資源的關鍵想法:
1、獲得資源后立刻放進管理對象內
2、管理對象運用析構函數(shù)釋放資源
注意是:shared_ptr和auto_ptr兩者都在析構函數(shù)上使用delete而不是delete[],所以在動態(tài)分配的數(shù)組上使用它們不好。當然我覺得還是少用動態(tài)數(shù)組,用vector,string啥的就能代替咯。
在資源管理類中小心copy行為
復制RAII對象時有兩種選擇:
1、禁止復制--------將copying操作聲明為private
class Lock:private Uncopyable{ public: .... };
2、對底層資源祭出"引用計數(shù)法"--------即shared_ptr
class Lock{ public: explicit Lock(Mutex* pm):mutexPtr(pm,unlock)//unlock函數(shù)為刪除器 { lock(mutexPtr.get()); } private: shared_ptr<Mutex>mutexPtr; }
復制底部資源:需要資源管理類對象的唯一理由是不需要某個復件資源時確保被釋放,在此情況下復制資源管理類對象,應該也復制其所包括的資源,即深拷貝------當一個對象被復制時,不論指針或其所指內存都會被制作出一個復件,即深拷貝。
轉移底部資源所有權:auto_ptr,你只希望有一個RAII對象指向一個未加工資源,即使被復制也是如此。
在資源管理類中提供對原始資源的訪問
前提:智能指針其實是一個類
shared_ptr<A>p(createA()); //假如有以下函數(shù) int func(const A* pi); //如下調用錯誤 因為p是一個智能指針不是一個指向A的指針 int f=func(p); //調用get函數(shù)返回原始資源 int f=func(p.get());
智能指針重載了指針取值操作符(->,*) 允許隱式轉換到原始指針
//例如A有一個函數(shù),p是一個指向A的智能指針 int A::getNum(); //如下調用合格,其實是發(fā)生了一個智能指針到原始指針的隱式轉換 int num=p->getNum();
一般而言顯示轉換比較安全,隱式轉換客戶使用方便。
成對使用new和delete時要采用相同形式
delete的最大問題在于:即將被刪除的內存之內究竟有多少個對象
即:被刪除的那個指針是指的單一對象還是成對數(shù)組?
string* p1=new string; string* p2=new string[100]; delete p1; delete[] p2;
規(guī)則很簡單:new中用了[],delete就要用[]
以獨立語句將new對象置入智能指針
假設有一個函數(shù)來揭示處理程序的優(yōu)先權,另一個函數(shù)用來在動態(tài)分配所得的Widget上進行某些帶有優(yōu)先權的處理
int priority(); void processWidget(shared_ptr<Widget>pw,int priority); //錯誤 processWideget(new Widget,priority()); //因為shared_ptr的構造函數(shù)需要一個原始指針,該構造函數(shù)是explicit,無法隱式轉換 processWideget(shared_ptr<Widget>(new Widget),priority());//可以
但是編譯器執(zhí)行順序不確定,調用該函數(shù)前,編譯器需要:
調用priority,執(zhí)行new Widget,shared_ptr構造函數(shù)
但調用priority的順序可以是第一第二或第三(new 和智能指針的先后順序不能變)
如何是先new,后priority,再shared_ptr,萬一priority調用失常,則new出來的指針遺失,尚未置入shaerd_ptr的構造函數(shù),則會資源泄漏。
因此分開寫最好:
shared_ptr<Widget>pw(new Wideget); processWidget(pw,priority());
到此這篇關于C++資源管理操作方法詳解的文章就介紹到這了,更多相關C++資源管理內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C語言中 int main(int argc,char *argv[])的兩個參數(shù)詳解
這篇文章主要介紹了C語言中 int main(int argc,char *argv[])的兩個參數(shù)詳解的相關資料,需要的朋友可以參考下2017-03-03C語言實現(xiàn)無規(guī)律數(shù)據加密、解密功能
這篇文章主要為大家詳細介紹了C語言實現(xiàn)無規(guī)律數(shù)據加密、解密功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-03-03