HeapAlloc间歇性失败



我们有一个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);

create之后我们分配了20个mystruct然后释放它们以确保它能处理。所以我们知道有足够的空间。

问题是在某些情况下HeapAlloc返回NULL。如果发生这种情况,我们做一个HeapValidate(m_hStackHeap, 0, NULL),它总是返回非零(意味着一切正常)。所以我们知道堆是正常的。

我们还保证在同一时间不会有超过10个并发分配,因此应该有足够的空间,因为初始heapCreate保留了那么多空间。

对HeapAlloc的下一次调用通常会成功。这种行为非常偶然。它会正常工作,然后分配失败几次,然后又开始正常工作。

知道是怎么回事吗?

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

比起使用自定义堆,您可以使用自定义ALLOC和FREE例程来保持适当大小的池。

这是通过将结构体与一个包含NEXT指针的简单对象和一个包含指针的全局变量进行联合来实现的。

如果你不在全局堆中分配一个新的。

你应该销毁堆释放所有这些

2mb structs?考虑使用VirtualAlloc和一个alloc/free指针列表

最新更新