根據《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。