C++ 關(guān)于拷貝控制和資源管理部分的筆記,并且介紹了部分C++ 智能指針的概念,然后實現(xiàn)了一個基于引用計數(shù)的智能指針。關(guān)于C++智能指針部分,后面會有專門的研究。

  • 通常,管理類外資源的類必須定義拷貝控制成員。為了定義這些成員,我們首先必須確定此對象的拷貝語義。一般來講,有兩種選擇:

    • 使類的行為看起來像一個值

      類的行為像一個值:意味著它有自己的狀態(tài)。當我們拷貝一個像值的對象時,副本和原對象是完全對立的。改變副本不會對對原對象有任何影響。反之亦然。
    • 使類的行為看起來像一個指針

      行為像指針的類則共享狀態(tài)。當我們拷貝一個這種類的對象時,副本和原對象使用相同的底層數(shù)據(jù)。改變副本也會改變原對象,反之亦然。
  • 行為像值的類

    • 通常組合了析構(gòu)函數(shù)和構(gòu)造函數(shù)的操作。類似析構(gòu)函數(shù),賦值操作會銷毀左側(cè)運算對象的資源。類似構(gòu)造函數(shù),賦值操作會從右側(cè)運算對象拷貝數(shù)據(jù)。

    • 編寫賦值運算符時,有兩點需要注意:

      1. 如果將一個對象賦予它自身,賦值運算符必須能正確工作2. 大多數(shù)賦值運算符組合了析構(gòu)函數(shù)和拷貝構(gòu)造函數(shù)的工作
    • 當編寫一個賦值運算符時,一個好的方法是先將右側(cè)運算對象拷貝到一個局部臨時對象中,然后再銷毀左側(cè)運算對象就是安全的了。

    • 為了提供類值的行為,對于類管理的資源,每個對象應(yīng)該都擁有一份自己的拷貝。

    • 類值拷貝賦值運算符

  • 定義行為像指針的類

    • 引用計數(shù)

      引用計數(shù)的工作方式如下:1. 除了初始化對象之外,每個構(gòu)造函數(shù)(拷貝構(gòu)造函數(shù)除外)還要創(chuàng)建一個引用計數(shù),用來記錄有多少對象正在與創(chuàng)建的對象共享狀態(tài)。當我們創(chuàng)建一個對象時,只有一個對象共享狀態(tài),因此計數(shù)器初始化為1。2. 拷貝構(gòu)造函數(shù)不分配新的計數(shù)器,而是拷貝給定對象的數(shù)據(jù)成員,包括計數(shù)器??截悩?gòu)造函數(shù)遞增共享的計數(shù)器,指出給定對象的狀態(tài)又被一個新用戶共享。3. 析構(gòu)函數(shù)遞減計數(shù)器,指出共享狀態(tài)的用戶少了一個。如果計數(shù)器變?yōu)?,則析構(gòu)函數(shù)釋放狀態(tài)。4. 拷貝賦值運算符遞增右側(cè)運算對象的計數(shù)器,遞減左側(cè)運算對象的計數(shù)器。如果左側(cè)運算對象的計數(shù)器變?yōu)?,意味著它的共享狀態(tài)沒有用戶了,拷貝賦值運算符就必須銷毀狀態(tài)。
    • 引用計數(shù)的存放位置:一種方法只保存在動態(tài)內(nèi)存中。當創(chuàng)建一個對象時,我們也分配一個計數(shù)器。當拷貝或賦值對象時,我們拷貝指向計時器的指針。使用這種方法,副本和原對象都會指向相同的計數(shù)器。

  • 下面給出一個基于引用計數(shù)的共享智能指針的實現(xiàn)。

            		

    網(wǎng)友評論