new内存太大引发进程崩溃

65次阅读

共计 355 个字符,预计需要花费 1 分钟才能阅读完成。

一. 简介

win32 下应用程序的内存最大限制为 2G,如果 new 一块很大的内存即使没有超过系统限制也可能会引发崩溃,因为 new 出来的内存是连续的。

二. 问题现象和跟踪分析

在调试一个内存越界的问题时,开启了 gflags -p /enable *.exe /full,之后进程再也无法启动成功,查看此时进程内存,亦只有 300 多 M,还剩余很多。另外产生的 dump 文件中,显示用户可用内存有 100 多 M。
通过调试发现,此时进程停在了 new 的地方,具体调用栈如图 1:

图 1 异常调用栈

查看 03 帧下 size 大小为 0x20ce7000, 大概为 550 多 M,因为 gflags 设置内存对齐后,需要更大的内存。申请不到,因此程序在此时出现异常。(查看此值大小需要设定操作系统符号文件路径)

图 2 申请内存大小

三. 问题解决

申请的内存大小变小后,未再出现异常。

正文完
 0