程序最多能new多少内存(2G内存里要放程序的5大区,HeapAlloc比new要快多了,而且超过2G的时候会告诉你)
根据《Windows核心编程》得知:X86操作系统提供每个程序最多只有4G的虚拟内存,其中2G虚拟内存提供给系统用(具体用来干什么还待考察),还有2G的内存留给用户使用。那这2G内存能拿来干嘛呢?首先给你介绍程序内存的5大区:栈区,堆区,全局区(静态区),文字常量区,程序代码区。这5大区就只能可怜的蜗居在这2G的内存里,所以我们要好好的珍惜这2G内存了!大部分程序员在申请堆时都习惯使用new,因为它简单好用,但很多一部分程序员不清楚我能new多少内存!这时候就得看你的除了堆区其余4大分区占用了多少内存了,总之new的内存不能超过2G。当你的程序5大分区总共占用了2G内存时,你还需要new内存的话,这时候系统不会告诉你内存不足,而是程序直接崩掉!所以很多程序因为new的内存忘记释放,久而久之,总用户内存超过2G时,程序就直接崩掉。这时候你肯定会问,我么应该怎么解决这个问题呢?由于我们无法统计用户内存使用了多少,还能new多少?还好微软给我们提供了很好的分配堆方法,就是用HeapAlloc分配堆。在调用HeapAlloc之前必须先调用HeapCreate创建辅助堆栈,记得HeapCreate与HeapFree,HeapAlloc与HeapDestroy一一对应,就跟new与delete一样。HeapAlloc不但具有new的功能,而且HeapAlloc在2G内存使用完时会返回一个空的指针告诉你内存用光了!HeapAlloc还有一个非常突出的有点,就是它申请内存和释放内存非常非常快,比new快多了。
在这里给大家讲讲HeapAlloc的调用顺序,HeapAlloc->new->VirtualAlloc->malloc,malloc是C语言的申请内存方法,也是最底层的申请内存方法。这时候大家又会问,为什么HeapAlloc的申请内存会比new快那么多的呢,明明HeapAlloc调用了new方法啊?上面不是跟大家强调了吗,在调用HeapAlloc必须先调用HeapCreate。原来猫腻就出在HeapCreate身上!在给大家讲猫腻前先给大家讲讲我们内存的分布。系统的可用内存并不是井然有序的,而是这里一块,那里一块的。在调用new申请一块内存时,系统会到可用的内存中给你寻找你需要的内存。系统在寻找可用内存的过程需要一定的时间!这时候我就开始给大家讲讲这猫腻。在调用HeapCreate时,系统会给你创建一段连续可用的内存。当你调用HeapAlloc申请内存时,系统就会到你HeapCreate创建的连续可用的内存中分配你需要的内存给你。很显然,在一段连续的内存中分配内存肯定比在杂乱无章的内存中分配内存快!所以大家在C++环境做项目下,申请内存时,建议大家使用HeapAlloc。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
2016-01-05 utf8格式源代码中的字符串,默认都会当作char来处理,除非用L""符号来修饰
2016-01-05 Qt Installer Framework的学习
2016-01-05 发布Qt Quick桌面应用程序的方法
2015-01-05 MFC、WTL、WPF、wxWidgets、Qt、GTK、Cocoa、VCL 各有什么特点?
2015-01-05 C++Builder和VC的比较
2015-01-05 Apollo,Python,Delphi与Oracle之间的神话关系
2015-01-05 Delphi语言获得生命的原因和过程