一次調試內存泄漏的過程

        最近事少,嘗試做一個控件容器,下載一個微軟的代碼來研究,不得法,於是建一個新工程,把重要代碼一點點拷過去,總算要完成最基本的功能了,然而在程序退出時顯示一個內存泄漏。不大,只有4個字節,心中很不爽,找一些調試內存泄漏的文章來看,大部分說用_CrtDumpMemoryLeaks()什麼的,還說在vs裏,默認的就能把內存泄漏的地址,包括源代碼行告訴你,我看了一下,只給出地址,沒給出行。反覆執行多次,發現都是在同一個地址處泄漏,這就好辦了,在該地址處下內存斷點,需要在程序運行起來後設置。經過這麼一試,發現原來的代碼在一個函數內完成了這幾個字節的分配和釋放,而我建的程序則是隻分配不釋放。經過一系列折騰,發現了內存分配函數malloc和_malloca的區別,malloc不設置堆標誌,而_malloca則會設置堆內存標誌。再看釋放,_freea函數會根據是否有堆標誌來決定是否來釋放內存,由於我是用malloc來分配的內存,沒有設置堆標誌,而在用_freea來釋放時又發現沒有這個標誌而不去釋放,結果造成了泄漏。在vs裏,不論是_malloca還是_freea,都是一個宏定義,最終是否真正分配或者釋放內存,還看是不是真正調用了malloc和free,這就要跟到mfc以及crt的程序裏去看,並結合內存監視,看看內存有沒有改變。所以我用_malloca來替代malloc來分配內存,最終問題得以解決。另外一個知識就是,堆內存需要釋放,而棧內存不需要釋放,或者說不需要我們來釋放,這就是有些內存最後沒有釋放,就是因爲它沒有堆標誌,底層代碼根據這一點來決定是置之不理還是給它釋放掉,看到沒有堆標誌,所以就把它放在那裏,造成了泄漏。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章