日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C++資源管理操作方法詳解_C 語言

作者:RolleX ? 更新時間: 2022-11-14 編程語言

以對象管理資源

class A{...};
//工廠函數createA來提供特定的A對象
A* createA();
//壞情況
void f(){
    A* p=createA();
    ...
    delete p;//如何在delete之前程序先return了,則無法delete
}
//為了確保資源釋放 將資源放進對象內 利用對象的析構函數來釋放
void f(){
    std::shared_ptr<A> p(createA());
    ...
    //程序結束后會經shared_ptr的析構函數釋放
}

auto_ptr已經被廢除,主要原因是其拷貝會造成所以權轉移,所以使用shared_ptr更好

以對象管理資源的關鍵想法:

1、獲得資源后立刻放進管理對象內

2、管理對象運用析構函數釋放資源

注意是:shared_ptr和auto_ptr兩者都在析構函數上使用delete而不是delete[],所以在動態分配的數組上使用它們不好。當然我覺得還是少用動態數組,用vector,string啥的就能代替咯。

在資源管理類中小心copy行為

復制RAII對象時有兩種選擇:

1、禁止復制--------將copying操作聲明為private

class Lock:private Uncopyable{
public:
    ....
};

2、對底層資源祭出"引用計數法"--------即shared_ptr

class Lock{
public:
    explicit Lock(Mutex* pm):mutexPtr(pm,unlock)//unlock函數為刪除器
    {
        lock(mutexPtr.get());
    }
private:
    shared_ptr<Mutex>mutexPtr;
}

復制底部資源:需要資源管理類對象的唯一理由是不需要某個復件資源時確保被釋放,在此情況下復制資源管理類對象,應該也復制其所包括的資源,即深拷貝------當一個對象被復制時,不論指針或其所指內存都會被制作出一個復件,即深拷貝。

轉移底部資源所有權:auto_ptr,你只希望有一個RAII對象指向一個未加工資源,即使被復制也是如此。

在資源管理類中提供對原始資源的訪問

前提:智能指針其實是一個類

shared_ptr<A>p(createA());
//假如有以下函數
int func(const A* pi);
//如下調用錯誤 因為p是一個智能指針不是一個指向A的指針
int f=func(p);
//調用get函數返回原始資源
int f=func(p.get());

智能指針重載了指針取值操作符(->,*) 允許隱式轉換到原始指針

//例如A有一個函數,p是一個指向A的智能指針
int A::getNum();
//如下調用合格,其實是發生了一個智能指針到原始指針的隱式轉換
int num=p->getNum();

一般而言顯示轉換比較安全,隱式轉換客戶使用方便。

成對使用new和delete時要采用相同形式

delete的最大問題在于:即將被刪除的內存之內究竟有多少個對象

即:被刪除的那個指針是指的單一對象還是成對數組?

string* p1=new string;
string* p2=new string[100];
delete p1;
delete[] p2;

規則很簡單:new中用了[],delete就要用[]

以獨立語句將new對象置入智能指針

假設有一個函數來揭示處理程序的優先權,另一個函數用來在動態分配所得的Widget上進行某些帶有優先權的處理

int priority();
void processWidget(shared_ptr<Widget>pw,int priority);
//錯誤
processWideget(new Widget,priority());
//因為shared_ptr的構造函數需要一個原始指針,該構造函數是explicit,無法隱式轉換
processWideget(shared_ptr<Widget>(new Widget),priority());//可以

但是編譯器執行順序不確定,調用該函數前,編譯器需要:

調用priority,執行new Widget,shared_ptr構造函數

但調用priority的順序可以是第一第二或第三(new 和智能指針的先后順序不能變)

如何是先new,后priority,再shared_ptr,萬一priority調用失常,則new出來的指針遺失,尚未置入shaerd_ptr的構造函數,則會資源泄漏。

因此分開寫最好:

shared_ptr<Widget>pw(new Wideget);
processWidget(pw,priority());

原文鏈接:https://blog.csdn.net/RolleX/article/details/126972818

欄目分類
最近更新