構造析構中的虛函式

2021-05-22 05:56:18 字數 1141 閱讀 4227

今天花了好長時間在專案中找到乙個記憶體洩漏的bug,其根本原因是設計思想在作怪。犯了c++之兵家大忌,在析構中呼叫

了虛函式。拿出來和大家分享一下~_~

假設我們有這樣的乙個設計:

class itemcontainbase   //存放元素的容器

itemcontainbase::itemcontainbase()

void itemcontainbase::destory(void)

void itemcontainbase::destoryitems(void)}}

class itemwindowcontain : public itemcontainbase //存放元素的視窗容器 

~itemwindowcontain(){}       //在父類中已經用多型實現了銷毀的操作,所有這裡為空

private:

virtual void destoryitems();     //重寫父類的    

listm_itemwindos;      //主要是為元素動態生成視窗

};void itemwindowcontain::destoryitems()}}

測試**如下:

itemwindowcontain* pwindowcontain = new itemwindowcontain;

delete pwindowcontain;

在析構的時候,結果會按照設計者的思想去銷毀itemwindowcontain中的m_itemwindos和繼承下來的

m_items中的所有元素嗎? 答案是否定的。在itemcontainbase的析構函式中並沒有對destoryitems

進行多型的操作,它呼叫了自己的destoryitems也就是itemcontainbase::destoryitems. 這樣悲劇就

發生了,如果不停的使用new delete itemwindowcontain元素; 就會不停地記憶體洩漏. 同樣的情況也會

發生在建構函式中。

如果你在開發過程中碰到了r6025 pure virtual function call的錯誤,那麼你很可能就是用了上面的

錯誤的設計思想. 在構造或析構函式中間接地呼叫了純虛函式。

所以得出乙個結論: 絕不能在構造或析構函式中間接呼叫純虛函式,也不要呼叫虛函式。

建構函式 析構函式 虛析構函式

說析構函式之前,先說下建構函式。建構函式用來完成對物件的一系列初始化操作,主要作用有 1.給建立的物件建立乙個識別符號 2.為物件資料成員開闢記憶體空間 3.完成物件資料成員的初始化 當並未顯示的定義建構函式時,會生成乙個預設的建構函式,預設建構函式不能完成物件資料成員的初始化,只能給物件建立一識別...

C 建構函式 析構函式 虛析構函式

一般地,建立物件和刪除物件時,父類建構函式 子類建構函式 子類析構函式 父類析構函式。特例 如果用new建立了乙個物件,並將父類的指標指向這個子類的物件,那麼用delete撤銷物件時,系統只執行基類的析構函式,而不執行派生類的析構函式。如果希望按照子類析構函式 父類析構函式的順序執行,那麼應該將基類...

建構函式 析構函式 虛函式

在類中,建構函式用於初始化物件及相關操作。建構函式是不能宣告為虛函式的,因為虛函式對應乙個virtual table 虛函式表 這個表的位址是儲存在物件的記憶體空間的。而在執行建構函式前,物件尚未完成建立,記憶體都沒有被分配,所以無法去查詢虛函式表,它不存在,因此也就無法得知該呼叫哪乙個函式了。析構...