C 中為什麼派生類中只有基本型別時,delete乙個指向派生類的基類指標時卻沒有記憶體洩漏?

時間 2021-05-11 22:12:49

1樓:

你試試這樣:

class

widget

:public

QWidget

};MSVC的string實現方式是SSO,大致的原理是內建乙個char棧陣列,如果字串很短的話就不使用堆記憶體,你那個寫法string還是空的,沒有分配堆記憶體,從頭到尾都只在棧上有資料當然不存在記憶體洩漏問題,所以你還需要強制地給string賦乙個特別長的值,迫使string分配堆記憶體,然後你就看到記憶體洩漏在哪了。

2樓:Chengbb

我理解new的時候要傳入記憶體塊的大小,而此時子類基本型別成員的大小已經包括在內,delete的時候會一起被釋放掉,只有當子類的操作中再次動態申請了記憶體,這片記憶體將不能通過基類指標delete掉,因此基類需要申明虛析構函式,在子類析構函式中釋放這些記憶體

3樓:

因為派生類只有基本的型別的話, delete x雖然沒有呼叫派生類的析構函式(因為基類的析構不是虛函式), 也是能正確釋放記憶體的, 因為一般x所指向的記憶體前面會有記錄實際分配了多少記憶體

4樓:cola

基類析構函式要用虛函式。這樣析構時才會先刪派生類再刪基類,否則只會delete基類,派生類的析構函式不會呼叫,從而產生記憶體洩露。

為什麼 C 中,基類指標可以指向派生類物件?

WangKX 語法就這麼規定這叫多型性,如果往深點說,因為子類物件一般比父類物件大,因此這麼指並沒問題,但反過來不行比如子類指標指向父類物件 馬東啥梅來著 不同型別的指標在記憶體中所佔大小是相同的,區別在於編譯器對於指標的解釋是不同的。乙個指標指向某個類的物件,實際上是指向該物件所佔記憶體的首位址位...

C 中為什麼要有allocator類?

Wu Jarvis 我是這麼理解的 其實你只要分清vector中resize,reserve的關係就能明白了,resize時,當元素數量 capacity時不但會分配空間,而且會初始化元素 reserve只會做分配空間的事情,不會做初始化,這樣就把分配空間和初始化的事情分開來了,如果不分開的話,那麼...

C 中超出精度double型別的值為什麼會出現這種現象?

邱昊宇 真心沒那麼複雜。問 比 3 小的最大 double 究竟是多少?答 是 std nextafter 3.0,2.0 比如 double maxBelowThree std nextafter 3.0 2.0 auto uniqueDigits std numeric limits max d...