HeapAlloc 返回 0xC0000017:配额不足。

3
我正在分配一些数据类型,总大小为2mb。
我只使用一个堆,在分配一定数量的数据类型之前都能正常运行,我很确定这点是正确的,因为我已经注释掉了其中一个分配操作,并且它在下一个操作中崩溃了。
配额=磁盘空间?文档没有提供此特定功能的错误代码,我对应用程序进行了分析,进程中有足够的内存可供分配。此外,我在堆指针上设置了数据断点,但它并没有停止。当我一步步执行时,堆指针都正常,直到调用HeapAlloc时出现问题。
如此奇怪。。

3
指出实现编程语言将有所帮助。 - Kornel Kisielewicz
抱歉,MSVC++。我正在使用Windows 6.1 SDK,HeapAlloc位于winbase.h中。 - Sorlaize
1
“Not enough quota”是0xC0000017的字符串描述,但常量为STATUS_NO_MEMORY,已在文档中涵盖。请仔细检查您的分配和假设,或发布您的代码。 - J.J.
2个回答

2
尝试分配一个大块内存(即>2MB),直到出现错误,以确定问题是对象数量还是总堆大小。此外,请确保您没有分配超过2mb的内存?当达到2gb限制时,我曾看到过该错误,但除非您的页面文件已满,否则永远不会在2mb处发生。
如果所有其他方法都失败,请重新启动或尝试在另一台机器上运行。

我只是在加载一个1MB的文件作为简单游戏的一部分,不可能超过2GB!分配2GB或3GB失败了...嗯,也许与64位指针有关?我已经重新启动了,我将尝试在32位虚拟机上进行调试。 - Sorlaize
所以你可以分配1GB,但不能分配2GB?可能是你的后台分配了太多的内存吗?也许要跟踪你调用分配的次数和每次分配的数量。 - Andrew
是的,我可以很好地分配1GB,我一定是太过于操纵指针了。我可视化了分配过程,以便能看到1GB的分配还剩下大约500MB左右,之后在调试代码时,整个程序没有超过2GB。非常感谢您的帮助!! - Sorlaize
这个错误可能是由于内存泄漏引起的吗? - vCillusion

1
根据WinNt.h中的值,异常代码C0000017映射到STATUS_NO_MEMORY,这是HeapAlloc将抛出的异常之一。因此,您可能已经用完了内存,或者溢出了一个分配的缓冲区并破坏了堆栈。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接