欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2022年09月24日 11:53:04   作者:RolleX  
系統(tǒng)中的資源,諸如動態(tài)申請的內(nèi)存,文件描述符,數(shù)據(jù)庫連接,網(wǎng)絡(luò)socket等,在不用的時候,應(yīng)該及時歸還給系統(tǒng),否則就會造成內(nèi)存泄露

以對象管理資源

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

auto_ptr已經(jīng)被廢除,主要原因是其拷貝會造成所以權(quán)轉(zhuǎn)移,所以使用shared_ptr更好

以對象管理資源的關(guān)鍵想法:

1、獲得資源后立刻放進(jìn)管理對象內(nèi)

2、管理對象運(yùn)用析構(gòu)函數(shù)釋放資源

注意是:shared_ptr和auto_ptr兩者都在析構(gòu)函數(shù)上使用delete而不是delete[],所以在動態(tài)分配的數(shù)組上使用它們不好。當(dāng)然我覺得還是少用動態(tài)數(shù)組,用vector,string啥的就能代替咯。

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

復(fù)制RAII對象時有兩種選擇:

1、禁止復(fù)制--------將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;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

以獨(dú)立語句將new對象置入智能指針

假設(shè)有一個函數(shù)來揭示處理程序的優(yōu)先權(quán),另一個函數(shù)用來在動態(tài)分配所得的Widget上進(jìn)行某些帶有優(yōu)先權(quán)的處理

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

但是編譯器執(zhí)行順序不確定,調(diào)用該函數(shù)前,編譯器需要:

調(diào)用priority,執(zhí)行new Widget,shared_ptr構(gòu)造函數(shù)

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

如何是先new,后priority,再shared_ptr,萬一priority調(diào)用失常,則new出來的指針遺失,尚未置入shaerd_ptr的構(gòu)造函數(shù),則會資源泄漏。

因此分開寫最好:

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

到此這篇關(guān)于C++資源管理操作方法詳解的文章就介紹到這了,更多相關(guān)C++資源管理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言之循環(huán)語句詳細(xì)介紹

    C語言之循環(huán)語句詳細(xì)介紹

    大家好,本篇文章主要講的是C語言之循環(huán)語句詳細(xì)介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C++控制臺版掃雷游戲

    C++控制臺版掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了C++控制臺版掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C語言中 int main(int argc,char *argv[])的兩個參數(shù)詳解

    C語言中 int main(int argc,char *argv[])的兩個參數(shù)詳解

    這篇文章主要介紹了C語言中 int main(int argc,char *argv[])的兩個參數(shù)詳解的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • C語言實現(xiàn)無規(guī)律數(shù)據(jù)加密、解密功能

    C語言實現(xiàn)無規(guī)律數(shù)據(jù)加密、解密功能

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)無規(guī)律數(shù)據(jù)加密、解密功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • C++設(shè)計模式之裝飾模式

    C++設(shè)計模式之裝飾模式

    這篇文章主要介紹了C++設(shè)計模式之裝飾模式,裝飾模式能夠?qū)崿F(xiàn)動態(tài)的為對象添加功能,是從一個對象外部來給對象添加功能,需要的朋友可以參考下
    2014-10-10
  • 如何運(yùn)用Capstone實現(xiàn)64位進(jìn)程鉤子掃描

    如何運(yùn)用Capstone實現(xiàn)64位進(jìn)程鉤子掃描

    本章將通過Capstone引擎實現(xiàn)64位進(jìn)程鉤子的掃描,讀者可使用此段代碼檢測目標(biāo)進(jìn)程內(nèi)是否被掛了鉤子,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • 關(guān)于背包問題的一些理解和應(yīng)用

    關(guān)于背包問題的一些理解和應(yīng)用

    這篇文章主要介紹了關(guān)于背包問題的一些理解和應(yīng)用,本文可以說是背包問題九講的補(bǔ)充、讀后感,需要的朋友可以參考下
    2014-08-08
  • c++冒泡排序詳解

    c++冒泡排序詳解

    冒泡排序(Bubble Sort),是一種計算機(jī)科學(xué)領(lǐng)域的較簡單的排序算法。它重復(fù)地走訪過要排序的數(shù)列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數(shù)列的工作是重復(fù)地進(jìn)行直到?jīng)]有再需要交換,也就是說該數(shù)列已經(jīng)排序完成。
    2017-05-05
  • C++深入探究友元使用

    C++深入探究友元使用

    采用類的機(jī)制后實現(xiàn)了數(shù)據(jù)的隱藏與封裝,類的數(shù)據(jù)成員一般定義為私有成員,成員函數(shù)一般定義為公有的,依此提供類與外界間的通信接口。但是,有時需要定義一些函數(shù),這些函數(shù)不是類的一部分,但又需要頻繁地訪問類的數(shù)據(jù)成員,這時可以將這些函數(shù)定義為該類的友元函數(shù)
    2022-07-07
  • 全面了解結(jié)構(gòu)體、聯(lián)合體和枚舉類型

    全面了解結(jié)構(gòu)體、聯(lián)合體和枚舉類型

    下面小編就為大家?guī)硪黄媪私饨Y(jié)構(gòu)體、聯(lián)合體和枚舉類型。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-07-07

最新評論