Malloc 在 Win64 上偶尔会返回 null

Ser*_*gey 5 c c++ windows memory-management heap-memory

免责声明:我将问题标记为 C 和 C++,就像我std::malloc在 C++ 项目中使用的那样。

我的 C++ 应用程序重复分配/释放一些内存。在大多数情况下我使用new/ delete,但在其中一些(自定义容器)中我使用std::malloc. 运算符new从不返回 nullptr 或 throws bad_alloc,但std::malloc在某些机器上偶尔会返回 nullptr 。

目前我们仅针对 Win64 进行构建,绝大多数用户使用 Windows 10。

可能是什么原因?

  • 我排除了物理内存耗尽的情况,因为应用程序分配的内存少于 3 Gb,而这些机器有 8-16 Gb + 交换空间。
  • Malloc 参数始终大于零且小于 256 Mb。这是通过断言验证的。
  • 假设1:会不会是由于碎片导致地址空间耗尽?应用程序中的小缓冲区重新分配可能每秒发生多次,但它们的大小通常为几千字节。
  • 假设2:是否可能是由于应用程序中的错误导致内存损坏?Windows 是否将一些堆服务信息存储在应用程序可访问的内存中,应用程序可以在其中覆盖它而不会因访问冲突而崩溃?您能否提供一些 Windows 堆管理解释的链接。

PS 我仅使用默认堆,没有自定义分配的 WinAPI 堆。