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