關于內存泄露的問題(解決+剖析)
首先先闡明這篇隨筆的意圖,只在告訴讀者,內存泄露的神不知鬼不覺,希望能引起大家的注意。
一段代碼的意思如何正確表達,才能不造成內存泄露呢?很多朋友經常泄露了內存但卻查找不到原因。當然在CLI/C++中利用托管對象堆上的垃圾收集器是可以更好地避免這一點。但是在更早的版本中,程序員有必要去手動刪除這些相關資源。否則將在程序關閉的時候出現一些錯誤。
MFC
現在我們去重載一個虛函數virtualvoidDeleteContents();用來在銷毀文檔數據前調用框架刪除一些文檔類的數據,(MSDN:Called by the framework to delete the document's data without destroying the CDocument object itself.)
先批評一段代碼:

2



3

4



5

6

7

8

優化:

?2



?3

?4

?5

?6



?7

?8

?9

10

填寫for循環內的語句。這里的任務:刪除之前利用CObArray : m_obArray對象保存的一個指針所指向的對象,以及指針本身。因此(以下提供幾種常見的錯誤代碼)
代碼A:

?2



?3

?4

?5

?6



?7

?8

?9

10

11


?2



?3

?4

?5

?6



?7

?8

?9

10

11

因此有人突發奇想:如果我每次只刪除第0個數據的話,那么是否就可以了呢?于是代碼B誕生了。可是問題終究沒能得到解決。因為假設有一組數據一共3個。刪除了編號0的元素(delete語句),移除了該元素的指針,此時i=1,進入刪除,又到了delete語句,這時候刪除元素i=1這樣的語句,這時實際上是刪除了先前元素中的第二個元素,而不是第一個。而0與2中間的第1個元素則未被刪除。又出現了隱含問題。其實只要將兩個都改為0,每次都刪除第一個就可以了。

?2



?3

?4

?5

?6



?7

?8

?9

10

11


?2



?3

?4

?5

?6



?7

?8

?9

10

11

12


?2



?3

?4

?5

?6



?7

?8

?9

10

11
