第十三章 13 2 1節練習

2021-06-25 14:51:43 字數 1291 閱讀 6882

練習13.23

比較上一節練習中你編寫的拷貝控制成員和這一節中的**。確定你理解了你的**和我們的**之間的差異(如果有的話)。

解答:這道題的解答建立在你對13.22題的實現上面,如果個人實現了,可以進行對比。

練習13.24

如果本節中的hasptr版本未定義析構函式,將會發生什麼?如果未定義拷貝建構函式,將會發生什麼?

解答:1. 如果沒有定義析構函式的話,會造成記憶體洩露。因為,成員變數ps是通過new操作在堆上顯式分配出的一段記憶體,需要使用delete顯式的去釋放。

2. 如果沒有定義拷貝建構函式的話,可能會造成二次釋放,或使用懸空指標的情況。因為,在合成的賦值運算子中,讓不同例項的ps指向同一段記憶體的起始位置。當其中有乙個例項對記憶體進行釋放或其他操作時,別的例項也會受到印象,如果只是修改值之類的操作,影響並不是很大(不至於崩潰);但是,當有釋放的操作時,程式很可能會發生崩潰。

練習13.25

假定希望定義strblob的類值版本,而且希望繼續使用shared_ptr,這樣我們strblobptr類就仍能使用指向vector的weak_ptr了。你修改後的類將需要乙個拷貝建構函式和乙個拷貝賦值運算子,但不需要析構函式。解釋拷貝建構函式和拷貝賦值運算子必須要做什麼。解釋為什麼不需要析構函式。

解答:這裡strblob使用的是share_ptr智慧型指標,也就無需像hasptr那樣做出開闢新空間的行為了,需要做的只是直接賦值就可以了,這樣只會增加share_ptr的引用數,而不用擔心多次釋放的問題(只要不適用get,進行對指標的顯式釋放)。

不需要析構函式是指,直接使用預設的析構函式就可以了,因為shared_ptr是乙個類,可以自行管理銷毀,不需要顯式的去釋放。其他的成員變數,都是在棧中建立,在生命週期結束的時候,也就會銷毀。所以,預設的析構函式足矣。

練習13.26

對上一題中描述的strblob類,編寫你自己的版本。

解答:大概就是這樣了

strblob& operator=(const strblob& ori)

strblob(const strblob& ori):data(ori.data){}

我的實現是共用指標的方式,這樣多個實現拷貝的話,是對同一buffer進行修改,這樣有悖常理。

strblob(const strblob& sb) :data(make_shared>(*sb.data)) {}   //拷貝建構函式  

strblob& strblob::operator= (const strblob& sb) //拷貝複製運算子

第十三章 13 6 1節練習

練習13.45 解釋右值引用和左值引用的區別。解答 左值引用就是常規引用。右值引用是在c 11之後新增到c 的新特性。引用 對於常規引用,我們不能將其繫結到要求轉換的表示式 字面常量或是返回右值的表示式。引用 右值引用有著完全相反的繫結特性 我們可以講乙個右值引用繫結到這類表示式上,但是不能講乙個右...

第十三章 13 1 6節練習 13 2節練習

練習13.18 定義乙個employee類,它包含雇員的姓名和唯一的雇員證號。為這個類定義預設建構函式,以接受乙個標識雇員姓名的string的建構函式。每個建構函式應該通過遞增乙個static資料成員來生成乙個唯一的證號。解答 class employee int employee id 0 emp...

第十三章 併發

13.1 動機 13.2 基本執行緒 如果必須要控制現成的執行順序,最好是根本不用執行緒,而是自己編寫特定順序彼此控制的協作子程式。繼承thread類或者實現runnable介面。內部類實現。13.3 共享受限資源 1 如果要對類中的某個方法進行同步控制,最好同步所有方法。如果忽略了其中乙個,通常很...