一.简介
win32下应用程序的内存最大限制为2G,如果new一块很大的内存即使没有超过系统限制也可能会引发崩溃,因为new出来的内存是连续的。
二.问题现象和跟踪分析
在调试一个内存越界的问题时,开启了gflags -p /enable *.exe /full,之后进程再也无法启动成功,查看此时进程内存,亦只有300多M,还剩余很多。另外产生的dump文件中,显示用户可用内存有100多M。
通过调试发现,此时进程停在了new的地方,具体调用栈如图1:
图1 异常调用栈
查看03帧下size大小为0x20ce7000,大概为550多M,因为gflags设置内存对齐后,需要更大的内存。申请不到,因此程序在此时出现异常。(查看此值大小需要设定操作系统符号文件路径)
图2 申请内存大小
三.问题解决
申请的内存大小变小后,未再出现异常。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。