【发布时间】:2011-10-21 02:40:19
【问题描述】:
我们有一个 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 的下一次调用通常会成功。这种行为非常零星。它会正常工作,然后分配几次失败,然后再次开始正常工作。
有什么想法吗?
【问题讨论】:
-
我的假设是跟踪并发分配肯定有问题。您如何跟踪以确保您只有 10 个?
-
您是否通过了 HEAP_GENERATE_EXCEPTIONS 作为选项?它会告诉您它遇到了两种故障模式(内存不足与堆损坏)中的哪一种。
-
由于您使用的是 DLL,您是否正在访问由一个进程从另一个进程创建的堆? 私有堆对象的内存只有创建它的进程才能访问。 -- 来自 MSDN
-
如何创建堆?如果您使用的是有限大小的堆(例如,在创建时非零
dwMaximumSize),即使堆非常大,每个分配都被限制为 512K 之类的东西。sizeof(myStruct)*10给你多大尺寸? -
Andre 它不受限制: ::HeapCreate(0, sizeof(myStruct)*10, 0) 我们将零作为最大值。
标签: c++ windows dll visual-studio-2005 heapalloc