我们有一个DLL(使用VC2005构建),该DLL代表调用应用程序进行一些处理。此处理需要大量内存。 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个以上的并发分配,因此应该有足够的空间,因为最初的stackCreate保留了那么多空间。

下一次调用HeapAlloc通常会成功。该行为非常零星。它将正常运行,然后分配几次,然后再次开始正常运行。

有什么想法吗?

最佳答案

该行为表明,这可能是由于堆碎片造成的。您可能有足够的总堆空间来满足请求,但是没有足够大的可用块。尝试使用碎片少的堆。您可以通过调用HeapSetInformation()启用LFH来实现。请注意,如果在HeapCreate()中指定了HEAP_NO_SERIALIZE标志,则不能使用LFH。

关于c++ - HeapAlloc间歇性失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6960865/

10-10 02:56