2011-06-18 61 views
1

我有一個程序,CRTDBG報告沒有泄漏,但根據Windows任務管理器佔用更多的內存隨着時間的推移。更糟糕的是,如果有足夠的時間,它將以退出代碼-1崩潰。增加內存使用量而不泄漏?

這是一個將成爲遊戲引擎的程序,現在我正在測試將通過快速加載和卸載關卡來卸載關卡的功能。這似乎有效,否則「最後」級別的實體會碰到當前的實體。當我正常運行程序時,內存不會增加,直到退出才加載一個級別而不卸載。

可能需要注意的是,加載一個關卡涉及從硬盤讀取數據並打開文件。知道我正在使用Chipmunk物理庫,Lua和OpenGL也可能很重要。

這使得這個最棘手的事情是CRTDBG不會轉儲,並且它在main()的末尾返回0。

編輯:另外,使用Visual Studio 2008

+0

指責工具通常不會讓你任何地方。證明它,故意泄漏內存並驗證它是否被報告。如果檢查出來,你需要分析你的程序,找出爲什麼數據持續太久。 –

+0

那麼,在main()的開頭粘貼'new'或者'malloc'。所以這可能是某種自動收集,CRTDBG不工作,或者我沒有正確實施。 – Lucas

回答

3

對我來說,這聽起來像你是不是真的泄漏內存,只分配了很多,然後釋放它在出口處。

也許你正在堅持一些對象的列表,你忘記在每個級別的加載之間釋放/刪除?

0

這可能是因爲你正在觀察「智能」分配器的作用,它要求操作系統尋找大塊內存和子分配。您可以通過替換全局operator newoperator delete進行檢查。如果這些告訴你所有分配的內存也被釋放,但進程的內存消耗增加或停留在那裏,那麼它(最可能)是分配器。

0

Lua的垃圾收集器收集時感覺就像它。如果你沒有明確訂購Lua來做一個集合,那麼內存可能會在那裏被建立起來而不被實際使用。

+0

強制垃圾收集器與加載級別相同的頻率不會阻止垃圾收集器。 – Lucas