1

我们有一个 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 个 myStruct,然后释放它们以确保它能够处理这些问题。所以我们知道有足够的空间。

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

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

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

关于发生了什么的任何想法?

4

3 回答 3

1

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

于 2011-08-05T20:18:16.393 回答
0

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

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

如果您不在,请从全局堆中分配一个新的。

你会在哪里销毁所有这些堆。

于 2011-08-05T18:32:30.137 回答
0

2mb 结构?考虑使用 VirtualAlloc 和分配/释放指针列表。

于 2011-08-07T23:05:32.097 回答