c++ - HeapAlloc 间歇性失败

标签 c++ windows dll visual-studio-2005 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);

在创建之后,我们实际上分配了 20 个 myStructs,然后释放它们以确保它能够处理。所以我们知道有足够的空间。

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

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

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

对正在发生的事情有什么想法吗?

最佳答案

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

关于c++ - HeapAlloc 间歇性失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6960865/

相关文章:

c++ - 调用程序本身的 LoadLibrary

C++ 最小值和最大值

c++ - 将编码的 std::string 从 Base16 转换为 Base10?

找不到c#dll

c++ - 在任何全局对象之前初始化

c# - 从 C# 传递到非托管 dll 后参数不正确

c++ - while循环c++中的非法指令

c++ - 带指针的 bitWrite 函数

c# - 将图像从 Openfiledialog 保存到特定文件夹?

windows - Azure 服务器中的 Laravel 队列