国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

堆內存和棧內存的使用方法

2019-11-10 18:39:03
字體:
來源:轉載
供稿:網友
1.堆內存和棧內存堆內存是區別于棧區、全局數據區和代碼區的另一個內存區域。堆允許程序在運行時動態地申請某個大小的內存在學習C程序設計語言時,會遇到兩個很相似的術語:堆內存和棧內存。這兩個術語雖然只有一字之差,但是所表達的意義差別還是很大的,堆內存和棧內存的區別可以用如下的比喻來看出:使用堆內存就象是自己動手做喜歡吃的菜肴,比較麻煩,但是比較符合自己的口味,而且自由度大。使用棧內存就象我們去飯館里吃飯,只管點菜(發出申請)、付錢和吃(使用),吃飽了就走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。操作系統中所說的堆內存和棧內存,在操作上有上述的特點,這里的堆內存實際上指的就是(滿足堆內存性質的)優先隊列的一種數據結構,第1個元素有最高的優先權;棧內存實際上就是滿足先進后出的性質的數學或數據結構。2.使用堆內存會遇到的問題在標準C語言上,使用malloc等內存分配函數獲取內存即是從堆中分配內存,而在一個函數體中例如定義一個數組之類的操作是從棧中分配內存。從堆中分配的內存需要程序員手動釋放,如果不釋放,而系統內存管理器又不自動回收這些堆內存的話,那就一直被占用。如果一直申請堆內存,而不釋放,內存會越來越少,很明顯的結果是系統變慢或者申請不到新的堆內存。而過度的申請堆內存(可以試試在函數中申請一個1G的數組!),會導致堆被壓爆,結果是災難性的。3堆內存申請,釋放原理:

我們掌握堆內存的權柄就是返回的指針,一旦丟掉了指針,便無法在我們視野內釋放它。這便是內存泄露。而如果在函數中申請一個數組,在函數體外調用使用這塊堆內存,結果將無法預測。我們還知道在c/c++ 中定義的數組大小必需要事先定義好,他們通常是分配在靜態內存空間或者是在棧內存空間內的,但是在實際工作中,我們有時候卻需要動態的為數組分配大小,這時就要用到堆內存分配的概念。在堆內存分配時首先應該知道操作系統有一個記錄空閑內存地址的鏈表,當系統收到程序的申請時,會遍歷該鏈表,尋找第一個空間大于所申請空間的堆結點,然后將該結點從空閑結點鏈表中刪除,并將該結點的空間分配給程序,另外,對于大多數系統,會在這塊內存空間中的首地址處記錄本次分配的大小,這樣,代碼中的delete語句才能正確的釋放本內存空間。另外,由于找到的堆結點的大小不一定正好等于申請的大小,系統會自動的將多余的那部分重新放入空閑鏈表中。堆內存是向高地址擴展的數據結構,是不連續的內存區域。這是由于系統是用鏈表來存儲的空閑內存地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆內存的大小受限于計算機系統中有效的虛擬內存。由此可見,堆內存獲得的空間比較靈活,也比較大。堆內存是由new分配的內存,一般速度比較慢,而且容易產生內存碎片,不過用起來最方便。另外,在WINDOWS下,最好的方式是用VirtualAlloc分配內存,它直接在進程的地址空間中保留一快內存,雖然用起來最不方便,但是速度快,也最靈活。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 繁峙县| 九寨沟县| 梁山县| 长顺县| 嘉荫县| 吉林省| 太仆寺旗| 徐汇区| 彭水| 沭阳县| 建水县| 仁布县| 东光县| 历史| 临猗县| 山阳县| 泽库县| 志丹县| 高碑店市| 突泉县| 松阳县| 琼中| 寻乌县| 闸北区| 将乐县| 抚松县| 龙州县| 稻城县| 永和县| 定陶县| 贵定县| 额尔古纳市| 定边县| 万安县| 株洲市| 博爱县| 台南县| 垦利县| 永城市| 嘉善县| 瓦房店市|