2011-08-30 36 views
0

我正在創建一個窗口C++類,並且在註冊窗口類時爲每個創建的窗口(使用WNDCLASSEX結構的cbWndExtra等)使用額外的字節。 Does :: DestroyWindow(..)釋放分配的窗口的額外字節嗎?從窗口的額外字節泄漏內存?

看來,當我創建並銷燬循環中的許多窗口對象時,我的應用程序在任務管理器中的「提交大小」上升。

我的C++類不分配任何內存,而且它沒有控件/工具欄/菜單,它似乎沒有泄漏任何GDI對象或類似的東西,所以我懷疑它是額外的字節窗戶。

有沒有人有什麼想法可以出錯?

是否有一些API我應該調用釋放額外的字節?

在銷燬使用額外字節的窗口時,您還有其他事情要做嗎?

編輯: 我曾嘗試創建使用額外的字節的具體類的只是一個單一的窗口,並在循環中破壞它,並再次,我的應用程序的提交大小上升。我也等了幾個小時,提交量沒有減少。 額外的字節只包含一個指向表示窗口的對象的指針。該對象被破壞(它在循環中被靜態創建)。 無論如何,它似乎不是我的錯,它甚至可能不是Windows的一個bug(正如你所說 - 雖然我不是100%確定),所以我即將離開它...

+1

如果你沒有分配任何內存,並且你銷燬了所有的窗口,那麼就沒有泄漏。 –

+1

Windows中的內存管理太複雜了,無法從簡單的統計信息(如Commit大小)進行反向工程。使用分析器。只有當你運行一週後才能真正讓程序在OOM上轟炸時,你纔會感到困擾。或者一個或兩個單元測試。 –

回答

0

這是你的工作,通過設置cbWndExtra字段來釋放你引用的任何內存。如果你仔細想想,這是有道理的,因爲Windows不知道你是如何分配內存的(例如malloc,new,LocalAlloc等)

編輯:因爲我有一個downvote也許我不是清楚。如果您將指針粘貼到該字段中,並指向您在應用中分配的內容,則該內存不會被釋放。額外的字節將是,但不是他們指向的內容。

5

是的,它釋放額外的字節。也許你在存儲分配內存的指針,這就是泄漏。

此外,「落實大小」不下降不證明內存泄漏。分配器不會立即將釋放的內存返回給操作系統,他們可以保留並在以後重用。嘗試創建一個簡單的CreateWindowEx/DestroyWindow無限循環來驗證。