最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

以對(duì)象管理資源

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

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

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

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

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

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

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

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

1、禁止復(fù)制--------將copying操作聲明為private

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

2、對(duì)底層資源祭出"引用計(jì)數(shù)法"--------即shared_ptr

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

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

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

在資源管理類中提供對(duì)原始資源的訪問

前提:智能指針其實(shí)是一個(gè)類

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

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

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

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

成對(duì)使用new和delete時(shí)要采用相同形式

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

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

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

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

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

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

int priority();
void processWidget(shared_ptr<Widget>pw,int priority);
//錯(cuò)誤
processWideget(new Widget,priority());
//因?yàn)閟hared_ptr的構(gòu)造函數(shù)需要一個(gè)原始指針,該構(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ù),則會(huì)資源泄漏。

因此分開寫最好:

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

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

相關(guān)文章

  • C++11中使用using的方法

    C++11中使用using的方法

    在 C++ 中 using 用于聲明命名空間,使用命名空間也可以防止命名沖突。這篇文章主要介紹了C++11中使用using的方法,需要的朋友可以參考下
    2021-09-09
  • Cocos2d-x中CCEditBox文本輸入框的使用實(shí)例

    Cocos2d-x中CCEditBox文本輸入框的使用實(shí)例

    這篇文章主要介紹了Cocos2d-x中CCEditBox文本輸入框的使用實(shí)例,本文在代碼中用大量注釋講解了CCEditBox的使用方法,需要的朋友可以參考下
    2014-09-09
  • C++實(shí)現(xiàn)字符串轉(zhuǎn)整數(shù)(atoi)的代碼詳解

    C++實(shí)現(xiàn)字符串轉(zhuǎn)整數(shù)(atoi)的代碼詳解

    在編程中,經(jīng)常會(huì)遇到將字符串轉(zhuǎn)換為整數(shù)的需求,就像標(biāo)準(zhǔn)庫(kù)中的 atoi 函數(shù)一樣,本文給大家介紹了C++中字符串轉(zhuǎn)整數(shù)(atoi)的實(shí)現(xiàn)與解析,并有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2025-04-04
  • C++繼承介紹

    C++繼承介紹

    C++繼承可以是單一繼承或多重繼承,每一個(gè)繼承連接可以是public,protected,private也可以是virtual或non-virtual
    2013-01-01
  • C語言實(shí)現(xiàn)班級(jí)成績(jī)管理系統(tǒng)

    C語言實(shí)現(xiàn)班級(jí)成績(jī)管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)班級(jí)成績(jī)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C語言約瑟夫環(huán)的實(shí)現(xiàn)

    C語言約瑟夫環(huán)的實(shí)現(xiàn)

    這篇文章主要介紹了C語言約瑟夫環(huán)的實(shí)現(xiàn)的相關(guān)資料,這里主要是利用數(shù)據(jù)數(shù)據(jù)結(jié)果中循環(huán)鏈表來實(shí)現(xiàn),需要的朋友可以參考下
    2017-08-08
  • C++ Boost log日志庫(kù)超詳細(xì)講解

    C++ Boost log日志庫(kù)超詳細(xì)講解

    Boost是為C++語言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱
    2022-11-11
  • C++ push方法與push_back方法常見方法介紹

    C++ push方法與push_back方法常見方法介紹

    push與push_back是STL中常見的方法,都是向數(shù)據(jù)結(jié)構(gòu)中添加元素,本文還將簡(jiǎn)述push對(duì)應(yīng)的stack與queue系列,常見方法的介紹,以及與push_back相對(duì)應(yīng)的vector系列常見方法介紹,感興趣的朋友跟隨小編一起看看吧
    2022-11-11
  • C++異步操作future和aysnc與function和bind

    C++異步操作future和aysnc與function和bind

    這篇文章主要介紹了C++異步操作future和aysnc與function和bind,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • 基于C語言代碼實(shí)現(xiàn)掃雷游戲

    基于C語言代碼實(shí)現(xiàn)掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了基于C語言代碼實(shí)現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11

最新評(píng)論

城步| 巨鹿县| 仲巴县| 横山县| 尖扎县| 丹棱县| 宁化县| 都兰县| 温州市| 余江县| 和平区| 枞阳县| 兴安盟| 长春市| 原阳县| 措勤县| 玉田县| 勐海县| 古蔺县| 惠来县| 西安市| 兴宁市| 临武县| 宾阳县| 井研县| 额济纳旗| 明水县| 涡阳县| 德格县| 宁夏| 莱州市| 五华县| 贺兰县| 新和县| 无棣县| 鄂温| 九龙县| 宁明县| 怀集县| 大关县| 定西市|