2010-03-02 272 views
6

我的開發環境是VS2008,DX9,Windows XP。 我嘗試將保護處理添加到內存不足的情況。 當malloc返回NULL時,我會將一些資源分頁到磁盤,並釋放內存中的資源。爲什麼malloc總是返回NULL

但有時候,總是的malloc返回NULL,即使我釋放大部分的資源和進程的內存使用和虛擬機的大小隻有在任務管理器800MB。

我想用malloc分配88個字節應該是罰款,在進程的內存使用只有800MB。但malloc總是返回NULL。

難道這是內存碎片?它看起來不是這樣,因爲進程內存使用量不是太多。

alt text http://i.imagehost.org/0267/Snap2.jpg

+1

你能告訴我們一些代碼嗎? – 2010-03-02 06:15:41

+0

Exe由VS調試器啓動並附加。 – Buzz 2010-03-02 06:15:44

+0

void * AllocCRT(size_t size) { return malloc(size); } 內存使用:644,088K VM大小:671,064K – Buzz 2010-03-02 06:17:26

回答

2

你提到內存碎片,那肯定將是我的第一個猜測。嘗試下載this應用程序。它叫地址空間監視器,應該能夠告訴你它是否存在碎片問題。

+1

本監視器將分析他處理OS所看到的地址空間,而MSVC中的'malloc'則通過Windows Heap API工作。它不直接從系統分配內存,也不直接將其返回給系統。這意味着這個Monior將無法向你展示任何東西。對於像這樣的顯示器來說,整個程序堆看起來像是一個永遠分配內存的堅實的不可逾越的黑盒子。 – AnT 2010-03-02 06:29:38

+0

@AndreyT:我認爲'不會給你任何東西'有點強。進程堆使用用戶地址空間,以便您可以看到何時已用盡;這並不一定意味着malloc將無法分配堆已經保留的內存。它應該如此是當有空閒的地址空間時,如果需要分配比已經保留的內存更多的內存,堆應該能夠聲明。 – 2010-03-02 06:45:03

2

這可能是虛擬地址空間碎片。一種檢查方法是致電HeapCompact(GetProcessHeap(), 0)。如果這釋放了足夠的記憶,那麼這就是可能的原因。

另一個類似的原因會從調試器被啓動;導致Windows使用調試堆,這在很長一段時間內存在非常糟糕的行爲。要禁用該行爲,請在環境中設置_NO_DEBUG_HEAP=1並運行。

0

另一種可能是您的程序中可能存在一個錯誤。你認爲你要求88字節,但也許你傳遞了一個未初始化的變量並要求數百兆字節。或者,也許你之前做過的一些事情是過度運行一個緩衝區並損壞了堆,導致malloc()永遠失敗。

相關問題