2013-07-28 27 views
0

我有一個靜態庫,其中包含我的大部分代碼/對象。我有另一個繼承這些對象的庫:E.G.動態內存跨靜態庫

class SomeClass <-- from base library 

class AnotherSomeClass : public SomeClass <--another library 

在SomeClass中我有另一個對象SomeObject也是以同樣的方式繼承。

SomeObject *newobject = new AnotherSomeObject(); //for example SomeObject exists in one of the base classes in another library. 

我再上溯造型訪問其只存在於子類,像這樣的功能:

AnotherSomeObject *object = (AnotherSomeObject*)newobject; 

一切工作正常,除非我釋放內存,這是在基類來完成。我得到了:_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse))

這只是最近出現的很難診斷,因爲它工作正常,直到我對某些類進行了一些更改。

我現在刪除了繼承基類對象的子類對象,然後將基類對象設置爲NULL,而這似乎是工作的。

問題是爲什麼會發生這種情況?

+1

你在基類中有一個虛擬析構函數嗎? –

+2

好吧,使用dynamic_cast <>來代替,這就是它所要做的。破壞堆是否每天都是C++問題。 –

+0

Yochai Timmer - 我只是檢查它期望它是一個虛擬析構函數,並注意到它不是。我希望以這種方式繼承我的其他大部分類。這可能是原因嗎?編譯需要一段時間,所以會回覆你。 – Rebirth

回答

1

繼承時在基類中有一個虛擬析構函數是很重要的。

當您在程序中稍後調用delete時,如果您沒有虛擬析構函數,編譯器將生成調用屬於當前變量類型的析構函數的代碼。

因此,如果您持有基類類型的指針,則將使用基類析構函數。
如果您持有指向派生類類型的指針,將使用派生類析構函數。

這可能會導致各種問題,最常見的情況是您可以通過查看非常難以發現的內存泄漏來發現問題。

+0

是的,這似乎是問題所在。人爲錯誤。當我最初編寫基類時,我並不期望繼承它,但後來我發現我需要繼承它,並忘記將該虛擬添加到析構函數中。歡呼,指引我在正確的方向。 :) – Rebirth

+0

@DyP yeap,這就是我的意思。 –