999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

C++語言內存分配研究

2014-04-29 04:03:01張會
計算機時代 2014年5期
關鍵詞:分配程序

張會

摘 要: 詳細闡述了C++編譯器的內存分配形式,給出了堆、棧、文字常量區、寄存器區、靜態區、程序代碼區的分配策略,分析了內存分配中易產生的問題及導致程序運行出錯的原因和解決辦法,從而避免程序異常和內存錯誤,保證程序的健壯性和正確性。

關鍵詞: 內存; 堆; 棧; C++語言

中圖分類號:TP312 文獻標志碼:A 文章編號:1006-8228(2014)05-44-03

Abstract: The memory allocation strategy C++ compiler is described in detail in this paper. The distribution strategy of heap, stack, literals memory, register memory in C++ language is given. The causes and the solution of memory allocation problems and program running error are analyzed to avoid exception and memory errors, and guarantee the correctness and robustness of program.

Key words: memory; heap; stack; C++ language

0 引言

C++編譯器根據數據在內存中的生存期不同,將用戶使用的內存分為程序區、靜態存儲區和動態存儲區三個區域,其中動態存儲區又分為堆區、棧區和寄存器區。

1 內存分配形式

C++中內存分配形式有以下六種。

1.1 棧區(stack)

棧由編譯器自動分配及釋放,用于存放函數參數值,局部變量值等。棧是一塊連續的內存區域,它的大小為2M固定常數,因此程序中的變量能從棧中獲取空間較少。若棧的剩余空間大于所申請空間,編譯器將為程序提供棧空間,且按照向低地址生長方向分配連續的內存空間;若申請的空間超過棧的剩余空間,將報異常,提示棧溢出(overflow)[1]。

在調用函數時,第一個進棧的是被調用函數下一行的內存地址,再是函數參數,參數入棧的順序自右向左,再是函數的局部變量。函數調用結束后,首先出棧的是被調函數中的局部變量,再是參數,次序是自左向右,所有變量和參數都出棧后,棧頂指針指到調用函數的下一行內存地址,程序根據該地址跳轉到函數調用處的下一行自動執行。入棧數據的內存地址隨著入棧順序的先后向著內存地址減小的方向增長,隨著數據不斷入棧,內存地址不斷變小。由于棧的先進后出原則,棧不會產生內存碎片。雖然棧內存小,但效率高,棧中存儲的數據只在函數內有效,函數調用結束會因為數據出棧而被釋放。

1.2 堆區(heap)

堆內存由程序員分配及釋放,若程序員在程序中未釋放,則在程序運行結束后,由操作系統回收。堆是不連續的空閑內存區域,各塊區域由鏈表連接起來,其內存大小由系統中虛擬內存來確定,因此其空間較大,可以存放大量數據。

堆區分配內存空間時,系統會遍歷用于記錄內存空閑塊的鏈表,首次找到一個空間大于所申請空間的堆結點時,將該結點從鏈表中刪除。并將該結點的內存分配給程序,同時在這塊內存區域首地址處記錄本次內存分配大小,程序員在用delete或free釋放內存時,以此識別要刪除內存大小并正確刪除該段內存。若申請的內存空間與堆結點上的內存空間不相等,則系統會自動將堆結點上多余內存空間回收到空閑鏈表中。堆區在分配內存時,鏈表中地址遍歷方向是由低向高,因此堆區分配內存時是按照向高地址生長的方向分配不連續內存空間[1]。堆內存分配是由程序員進行分配及釋放,速度較慢,易產生內存碎片。

堆是不連續的內存區域,由鏈表將其串接起來的空閑塊,其不能像棧一樣可以為其中的某個存儲單元命名,堆中的每個內存單元都是匿名的,對堆的訪問只能先在堆中申請內存,再把申請內存的首地址保存在一個指針中,再通過指針來訪問內存。在C++中用malloc()和new關鍵字申請堆內存。寄存器區一般用于保存棧頂指針和指令指針。

1.4 靜態區(static)

全局變量和靜態變量的存儲是放在一塊的,已初始化的全局變量和靜態變量放在一塊區域,未初始化的全局變量和靜態變量存放于相鄰的另一塊區域,內存在程序結束后由系統釋放。靜態變量的空間在程序編譯階段進行分配,所分配內存在程序整個運行期間都存在[2]。

1.6 程序代碼區

存放函數體的二進制代碼。

2 內存分配中若干問題的分析

如果對內存分配策略理解不清楚,且程序設計不當,就極易引起對運行結果異常,且難以捕獲由內存分配所引起的錯誤。

本程序的輸出結果既不是隨機值,也不是3而是4,是由棧空間的連續分配所引起。在main()函數中,首先調用fun()函數,此時fun1()代碼行地址入棧,接著fun()中的局部變量x入棧,fun()調用結束后把x的內存地址值返回給main()函數中的p指針,此時棧中的x已經出棧。接著在main()中調用fun1()函數,此時對fun1()中的a進行棧內存的分配,其分配的棧空間正好是fun()函數中x變量所釋放的內存,對該內存賦值4后,回到主函數,此時棧空間的a變量內存被釋放,而此時p指針從未改變,與此同時,程序沒有其他語句代碼或變量需要分配棧空間,因此p指針所指的棧空間的值未被覆蓋,保留最后一次所賦值4,故程序最后輸出的值是4。因此掌握了內存中存儲空間的分配情況及原理,不難分析其異常的運行結果。

為防止讓指向常量的指針對所指常量進行值的改變,解決的辦法是把p聲明成常量指針,如:const char *p;以保證不能改變所指常量的值,若試圖通過指針改變常量的值,在編譯檢查時將報錯,不致于如上述程序段發生運行時錯誤。

2.3 堆區內存分配

堆中的內存是匿名的,對堆內存進行訪問只能通過指針進行訪問。通過指針訪問堆內存時,一定要注意防止內存泄露。內存泄露是指程序從堆中分配的內存塊該內存釋放后即存放了其他數據,但p中的地址值仍然是所釋放那段內存的地址值,因此第5行輸出*p的值是所釋放那段內存中已存放的隨機值。第6行p1指向新申請的一段內存,由于編譯器會默認將釋放掉的內存空間回收然后分配給新開辟的空間,因此第6行p1其實指向的是剛通p所釋放掉的空間3 內存分配中存在的其他情況

內存分配發生的異常,編譯器不能通過語法檢查發現,通常會發生程序運行結果異常,該類錯誤不易被捕捉,從而給程序員檢查程序錯誤帶來不便,因此在寫程序時盡量避免內存分配錯誤。常見的內存操作異常如下。

⑴ 內存分配失敗卻直接使用,如返回一個NULL指針。

⑵ 訪問內存時超出了內存分配的邊界。越界的內存可能保存其他變量的值,訪問該內存變量的值,可能產生異常,導致程序的終止甚至崩潰[4]。

⑶ 動態申請了內存空間如鏈表,而未動態釋放內存空間,或未完全釋放,只釋放了鏈表中的表頭指針所指向結點,而未釋放鏈表中的各個結點的內存空間,從而造成內存泄露。

(4)訪問已經釋放的內存,釋放已經釋放的內存。從而導致程序無法正確運行,得到無效值。

4 結束語

本文闡述了C++編譯器的內存分配形式,提出了堆、棧、文字常量區,寄存器區的分配策略,分析了內存分配中易產生的問題和原因,同時給出了因內存分配而導致程序錯誤的解決辦法,總之要解決程序中因內存分配所產生的問題,其前提是必須要清楚內存分配策略。通過本文對C++中內存分配策略的研究,可以使讀者在以后的程序編寫中有效的避免內存分配錯誤,從而保證程序的健壯性和正確性。

參考文獻:

[1] 王文龍.C/C++數據內存分配和指針使用中若干問題的分析[J].喀什

師范學院學報,2013.34(6):36-37

[2] 韓雨澇.C語言動態內存分配研究及應用[J].計算機時代,2009.5:

33-34

[3] 王金玲,柴萬東.C++動態內存分配研究[J].赤峰學院學報,2009.25

(4):19-20

[4] Eri R.Hanly.C語言詳解[M].人民郵電出版社,2007.

猜你喜歡
分配程序
基于可行方向法的水下機器人推力分配
應答器THR和TFFR分配及SIL等級探討
遺產的分配
試論我國未決羈押程序的立法完善
人大建設(2019年12期)2019-05-21 02:55:44
一種分配十分不均的財富
績效考核分配的實踐與思考
失能的信仰——走向衰亡的民事訴訟程序
“程序猿”的生活什么樣
英國與歐盟正式啟動“離婚”程序程序
環球時報(2017-03-30)2017-03-30 06:44:45
創衛暗訪程序有待改進
中國衛生(2015年3期)2015-11-19 02:53:32
主站蜘蛛池模板: 欧美日韩在线亚洲国产人| 国产在线拍偷自揄拍精品| 国产 日韩 欧美 第二页| 免费精品一区二区h| 99久久国产精品无码| 麻豆国产精品一二三在线观看| 国产精品视频导航| 香蕉99国内自产自拍视频| 91久久国产综合精品| 亚洲性影院| 免费一极毛片| 欧美黑人欧美精品刺激| 最新国产成人剧情在线播放 | 成人在线欧美| 国产成人福利在线视老湿机| 欧美另类精品一区二区三区| 国产视频只有无码精品| 波多野结衣一区二区三区88| 国产精品妖精视频| 日韩亚洲高清一区二区| 日日碰狠狠添天天爽| 国产av一码二码三码无码| 精品少妇人妻av无码久久| 亚洲人妖在线| 国产欧美精品专区一区二区| 福利视频久久| 久久九九热视频| 国产一区二区色淫影院| 欧美精品1区2区| 九九精品在线观看| 91在线视频福利| av一区二区无码在线| 久久久久久久蜜桃| 白浆视频在线观看| 亚洲欧洲日韩国产综合在线二区| 一级成人a毛片免费播放| 六月婷婷综合| 亚洲第一区欧美国产综合| 超清无码熟妇人妻AV在线绿巨人| 欧美一级一级做性视频| 在线观看国产小视频| 日韩高清欧美| 成人免费一区二区三区| 无码中文字幕精品推荐| 亚洲黄色片免费看| 亚洲成人网在线观看| 不卡的在线视频免费观看| 欧美午夜视频| 久久综合九九亚洲一区| 中文字幕亚洲无线码一区女同| 第一区免费在线观看| 亚洲三级电影在线播放| 国产呦视频免费视频在线观看| 亚洲欧美综合在线观看| 久久香蕉国产线看精品| 久久久久无码国产精品不卡 | www.youjizz.com久久| 国产97视频在线| 国产精品99久久久久久董美香| 67194在线午夜亚洲| 九九热精品在线视频| 久草青青在线视频| 秋霞午夜国产精品成人片| 国产三级精品三级在线观看| 精品视频免费在线| 在线不卡免费视频| 亚洲AV永久无码精品古装片| 久久国产乱子伦视频无卡顿| 亚洲人成在线精品| 欧美激情福利| 亚洲IV视频免费在线光看| 色妺妺在线视频喷水| 欧美a级在线| 亚洲欧美在线综合图区| 找国产毛片看| 伊人久久久大香线蕉综合直播| 日韩欧美网址| 97久久免费视频| 欧美午夜视频在线| 欧美亚洲中文精品三区| a毛片免费观看| 国内精品九九久久久精品|