面試寶典上vector的析構筆記

2021-09-30 01:35:59 字數 844 閱讀 4701

題目在書p105頁

#include

#include

#include

using

namespace std;

class

cdemo;~

cdemo()

;char

* str;}};

intmain

(int argc,

char

** ar**)

上面這個問題就是淺拷貝的問題

cdemo中沒有具體的拷貝建構函式時,會呼叫預設的拷貝建構函式,就是淺拷貝。

可以通過深拷貝解決這個問題,在cdemo中加入自己定義的拷貝建構函式

cdemo

(const cdemo &cd)

函式在執行到a1 -> push_back(d1);

呼叫自己的拷貝建構函式建立的dl_1,會在堆疊中申請另外的記憶體,而不是直接指向d1.str所指向的記憶體位址。

當**執行到delete a1的時候,vector呼叫了物件的析構函式~cdemo(),delete掉的是dl_1申請的記憶體(深拷貝實現)。

當**執行完,需要析構 d1 的時候,delete掉的是d1.str = new char[32]; 沒有重複delete。

所以,深拷貝就是開闢一塊新的記憶體,防止重複delete

參考:面試寶典上的vector二次析構問題

還有一些vector容量限制時,插入元素時拷貝構造函式呼叫的例子,如下文:

stl容器與拷貝建構函式

面試寶典上的vector析構函式

面試寶典上的vector析構函式 2009 10 09 11 00 include using namespace std class cdemo cdemo char str int main 書上說這段程式的錯誤是vector物件指標能夠自動析構,所以不需要呼叫delete a1,否則會造成兩次...

面試寶典上的vector二次析構問題

今天看面試寶典chap 9 stl模板與容器時,有一道面試題講vector二次析構出錯的,看了解答還不是很明白,經過google之後終於搞清楚了,記錄如下 面試寶典上的vector二次析構問題 include using namespace std class cdemo cdemo char st...

常見筆 面試題 之建構函式和析構函式

建構函式是用來初始化乙個物件的,而析構函式的作用則是釋放物件占用的空間。如果將虛函式 建構函式和析構函式結合起來會有怎麼樣的效果呢?建構函式可以是虛函式嗎?答 建構函式不可以是虛函式!基於以下幾點原因 1 構造乙個物件的時候,必須知道物件的實際型別,而虛函式行為是在執行期間動態確定實際型別的。在構建...