我们有一个动态链接库(使用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的下一次调用通常会成功。这种行为非常零星。它将正常工作,然后无法分配几次,然后再次开始正常工作。
你知道是怎么回事吗?
发布于 2011-08-06 04:18:16
该行为表明这可能是由于堆碎片造成的。您可能有足够的总堆空间来满足请求,但没有足够大的空闲块。尝试使用低碎片堆。您可以通过调用HeapSetInformation()来启用LFH。请注意,如果在HeapCreate()中指定了HEAP_NO_SERIALIZE标志,则不能使用LFH。
发布于 2011-08-06 02:32:30
除了使用定制的堆,您还可以使用定制的ALLOC和自由例程,这些例程可以保持适当大小的池。
这是通过将结构与一个包含下一个指针的简单对象和一个包含指针的全局变量联合起来完成的。
如果你在外面,从全局堆中分配一个新的。
在那里你会销毁堆,释放所有这些。
发布于 2011-08-08 07:05:32
2mb结构?考虑使用VirtualAlloc和分配/空闲指针列表。
https://stackoverflow.com/questions/6960865
复制相似问题