C++ 關(guān)于拷貝控制和資源管理部分的筆記,并且介紹了部分C++ 智能指針的概念,然后實(shí)現(xiàn)了一個(gè)基于引用計(jì)數(shù)的智能指針。關(guān)于C++智能指針部分,后面會(huì)有專門的研究。
通常,管理類外資源的類必須定義拷貝控制成員。為了定義這些成員,我們首先必須確定此對象的拷貝語義。一般來講,有兩種選擇:
使類的行為看起來像一個(gè)值
類的行為像一個(gè)值:意味著它有自己的狀態(tài)。當(dāng)我們拷貝一個(gè)像值的對象時(shí),副本和原對象是完全對立的。改變副本不會(huì)對對原對象有任何影響。反之亦然。
使類的行為看起來像一個(gè)指針
行為像指針的類則共享狀態(tài)。當(dāng)我們拷貝一個(gè)這種類的對象時(shí),副本和原對象使用相同的底層數(shù)據(jù)。改變副本也會(huì)改變原對象,反之亦然。
行為像值的類
通常組合了析構(gòu)函數(shù)和構(gòu)造函數(shù)的操作。類似析構(gòu)函數(shù),賦值操作會(huì)銷毀左側(cè)運(yùn)算對象的資源。類似構(gòu)造函數(shù),賦值操作會(huì)從右側(cè)運(yùn)算對象拷貝數(shù)據(jù)。
編寫賦值運(yùn)算符時(shí),有兩點(diǎn)需要注意:
1. 如果將一個(gè)對象賦予它自身,賦值運(yùn)算符必須能正確工作2. 大多數(shù)賦值運(yùn)算符組合了析構(gòu)函數(shù)和拷貝構(gòu)造函數(shù)的工作
當(dāng)編寫一個(gè)賦值運(yùn)算符時(shí),一個(gè)好的方法是先將右側(cè)運(yùn)算對象拷貝到一個(gè)局部臨時(shí)對象中,然后再銷毀左側(cè)運(yùn)算對象就是安全的了。
為了提供類值的行為,對于類管理的資源,每個(gè)對象應(yīng)該都擁有一份自己的拷貝。
類值拷貝賦值運(yùn)算符
定義行為像指針的類
引用計(jì)數(shù)
引用計(jì)數(shù)的工作方式如下:1. 除了初始化對象之外,每個(gè)構(gòu)造函數(shù)(拷貝構(gòu)造函數(shù)除外)還要?jiǎng)?chuàng)建一個(gè)引用計(jì)數(shù),用來記錄有多少對象正在與創(chuàng)建的對象共享狀態(tài)。當(dāng)我們創(chuàng)建一個(gè)對象時(shí),只有一個(gè)對象共享狀態(tài),因此計(jì)數(shù)器初始化為1。2. 拷貝構(gòu)造函數(shù)不分配新的計(jì)數(shù)器,而是拷貝給定對象的數(shù)據(jù)成員,包括計(jì)數(shù)器??截悩?gòu)造函數(shù)遞增共享的計(jì)數(shù)器,指出給定對象的狀態(tài)又被一個(gè)新用戶共享。3. 析構(gòu)函數(shù)遞減計(jì)數(shù)器,指出共享狀態(tài)的用戶少了一個(gè)。如果計(jì)數(shù)器變?yōu)?,則析構(gòu)函數(shù)釋放狀態(tài)。4. 拷貝賦值運(yùn)算符遞增右側(cè)運(yùn)算對象的計(jì)數(shù)器,遞減左側(cè)運(yùn)算對象的計(jì)數(shù)器。如果左側(cè)運(yùn)算對象的計(jì)數(shù)器變?yōu)?,意味著它的共享狀態(tài)沒有用戶了,拷貝賦值運(yùn)算符就必須銷毀狀態(tài)。
引用計(jì)數(shù)的存放位置:一種方法只保存在動(dòng)態(tài)內(nèi)存中。當(dāng)創(chuàng)建一個(gè)對象時(shí),我們也分配一個(gè)計(jì)數(shù)器。當(dāng)拷貝或賦值對象時(shí),我們拷貝指向計(jì)時(shí)器的指針。使用這種方法,副本和原對象都會(huì)指向相同的計(jì)數(shù)器。
下面給出一個(gè)基于引用計(jì)數(shù)的共享智能指針的實(shí)現(xiàn)。
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動(dòng)安全 [無線安全]玩轉(zhuǎn)無線電——不安全的藍(lán)牙鎖 2017-07-26
- 消息隊(duì)列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標(biāo)分割】 2017-07-26
- 詞向量-LRWE模型-更好地識別反義詞同義詞 2017-07-26
- 從棧不平衡問題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動(dòng)安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來看看(二) 2017-07-26