我们有一个 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 的下一次调用通常会成功。这种行为非常零星。它会正常工作,然后分配几次失败,然后再次开始正常工作。
关于发生了什么的任何想法?