我们有一个 DLL(使用 VC2005 构建)代表调用应用程序执行一些处理。此处理需要相当多的内存。 DLL 通过 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 的下一次调用通常会成功。这种行为非常零星。它会正常工作,然后分配几次失败,然后再次开始正常工作。
对正在发生的事情有什么想法吗?
最佳答案
该行为表明它可能是由于堆碎片造成的。您可能有足够的总堆空间来满足请求,但没有足够大的空闲 block 。尝试使用低碎片堆。您可以通过调用 HeapSetInformation() 来启用 LFH 来做到这一点。请注意,如果您在 HeapCreate() 中指定了 HEAP_NO_SERIALIZE 标志,则不能使用 LFH。
关于c++ - HeapAlloc 间歇性失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6960865/