我們有一個DLL(使用VC2005構建)代表調用應用程序進行一些處理。這個處理需要相當多的內存。該DLL創建通過heapAlloc這種記憶像這樣:HeapAlloc間歇性地失敗
//Allocate space
myStruct* pStackSpace = (myStruct*)::HeapAlloc(m_hStackHeap, 0, sizeof(myStruct));
...
do some processing here
...
//Free space
::HeapFree(m_hStackHeap, 0, pStackSpace);
堆通過分配:
m_hStackHeap = ::HeapCreate(0, sizeof(myStruct)*10, 0);
後,創建我們實際分配20個myStructs,然後釋放他們只是爲了確保它搞定。所以我們知道有足夠的空間。
問題是在某些情況下HeapAlloc返回NULL。如果發生這種情況,我們會做一個總是返回非零的HeapValidate(m_hStackHeap, 0, NULL)
(意思是說一切都很好)。所以我們知道堆是可以的。
我們還承認,我們從來沒有超過10個併發分配,所以應該有足夠的空間,因爲初始heapCreate保留了很多空間。
HeapAlloc的下一次調用通常會成功。行爲非常零星。它會正常工作,然後不分配幾次,然後再次開始正常工作。
關於正在發生的事情的任何想法?
我的假設是在跟蹤併發分配時一定會有問題。你如何跟蹤以確保你只有10個? – Chad
您是否已通過HEAP_GENERATE_EXCEPTIONS作爲選項?它會告訴你哪個失敗模式(內存不足或損壞的堆)被擊中。 –
由於您使用DLL,您是否正在訪問堆,由另一個進程創建? *私有堆對象的內存只能由創建它的進程訪問。* - 來自MSDN –