640K ought to be enough for everybody
― Bill Gates 1981
程序員們經常編寫內存管理程序,往往提心吊膽。如果不想觸雷,唯一的解決辦法就是發現所有潛伏的地雷并且排除它們,躲是躲不了的。本章的內容比一般教科書的要深入得多,讀者需細心閱讀,做到真正地通曉內存管理。
7.1內存分配方式
內存分配方式有三種:
(1) 從靜態存儲區域分配。內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變量,static變量。
(2) 在棧上創建。在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置于處理器的指令集中,效率很高,但是分配的內存容量有限。
(3) 從堆上分配,亦稱動態內存分配。程序在運行的時候用malloc或new申請任意多少的內存,程序員自己負責在何時用free或delete釋放內存。動態內存的生存期由我們決定,使用非常靈活,但問題也最多。
7.2常見的內存錯誤及其對策
發生內存錯誤是件非常麻煩的事情。編譯器不能自動發現這些錯誤,通常是在程序運行時才能捕捉到。而這些錯誤大多沒有明顯的癥狀,時隱時現,增加了改錯的難度。有時用戶怒氣沖沖地把你找來,程序卻沒有發生任何問題,你一走,錯誤又發作了。
常見的內存錯誤及其對策如下:
u 內存分配未成功,卻使用了它。
編程新手常犯這種錯誤,因為他們沒有意識到內存分配會不成功。常用解決辦法是,在使用內存之前檢查指針是否為NULL。如果指針p是函數的參數,那么在函數的入口處用assert(p!=NULL)進行檢查。如果是用malloc或new來申請內存,應該用if(p==NULL) 或if(p!=NULL)進行防錯處理。
u 內存分配雖然成功,但是尚未初始化就引用它。
犯這種錯誤主要有兩個起因:一是沒有初始化的觀念;二是誤以為內存的缺省初值全為零,導致引用初值錯誤(例如數組)。
內存的缺省初值究竟是什么并沒有統一的標準,盡管有些時候為零值,我們寧可信其無不可信其有。所以無論用何種方式創建數組,都別忘了賦初值,即便是賦零值也不可省略,不要嫌麻煩。
u 內存分配成功并且已經初始化,但操作越過了內存的邊界。
例如在使用數組時經常發生下標“多1”或者“少1”的操作。特別是在for循環語句中,循環次數很容易搞錯,導致數組操作越界。
u 忘記了釋放內存,造成內存泄露。
含有這種錯誤的函數每被調用一次就丟失一塊內存。剛開始時系統的內存充足,你看不到錯誤。終有一次程序突然死掉,系統出現提示:內存耗盡。
動態內存的申請與釋放必須配對,程序中malloc與free的使用次數一定要相同,否則肯定有錯誤(new/delete同理)。
u 釋放了內存卻繼續使用它。
有三種情況:
(1)程序中的對象調用關系過于復雜,實在難以搞清楚某個對象究竟是否已經釋放了內存,此時應該重新設計數據結構,從根本上解決對象管理的混亂局面。
(2)函數的return語句寫錯了,注意不要返回指向“棧內存”的“指針”或者“引用”,因為該內存在函數體結束時被自動銷毀。
(3)使用free或delete釋放了內存后,沒有將指針設置為NULL。導致產生“野指針”。
l 【規則7-2-1】用malloc或new申請內存之后,應該立即檢查指針值是否為NULL。防止使用指針值為NULL的內存。
l 【規則7-2-2】不要忘記為數組和動態內存賦初值。防止將未被初始化的內存作為右值使用。
l 【規則7-2-3】避免數組或指針的下標越界,特別要當心發生“多1”或者“少1”操作。
l 【規則7-2-4】動態內存的申請與釋放必須配對,防止內存泄漏。
l 【規則7-2-5】用free或delete釋放了內存之后,立即將指針設置為NULL,防止產生“野指針”。
7.3指針與數組的對比
C++/C程序中,指針和數組在不少地方可以相互替換著用,讓人產生一種錯覺,以為兩者是等價的。
數組要么在靜態存儲區被創建(如全局數組),要么在棧上被創建。數組名對應著(而不是指向)一塊內存,其地址與容量在生命期內保持不變,只有數組的內容可以改變。
指針可以隨時指向任意類型的內存塊,它的特征是“可變”,所以我們常用指針來操作動態內存。指針遠比數組靈活,但也更危險。
下面以字符串為例比較指針與數組的特性。
7.3.1 修改內容
示例7-3-1中,字符數組a的容量是6個字符,其內容為hello国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
日本在线天堂| 九九热在线视频| 中文资源在线官网| 在线观看精品视频一区二区三区| 久久国产精品久久久久久小说| 中文字幕日本在线| 国产成人午夜精品| 成人午夜无人区一区二区| 麻豆国产在线播放| 国产麻豆免费| 日p在线观看| 亚洲激情丁香| 亚洲综合天堂网| yjizz视频网站在线播放| 青青国产在线| 国产小视频在线观看| 国产美女性感在线观看懂色av| 四虎影视成人永久免费观看视频| eeuss影院在线观看第一页| 国产在线观看色| 国产精美视频| 国产91在线视频蝌蚪| 97影院理论午夜| www免费在线观看| 日本中文字幕视频在线| 国产爆初菊在线观看免费视频网站| 亚洲综合在线网| 91福利在线免费| 羞羞视频在线免费看| 中文字幕亚洲免费| 俺来俺也去www色在线观看| 国产一二三区精品视频| 日本久久网站| 中文av在线播放| 国产网站av| 五月伊人六月| 黄色片av在线| 天堂在线国产| 国产激情三区| 中文字幕在线影视资源| 免费在线你懂的| eeuss影院在线| 在线国产福利网站| 精品福利视频导航大全| 国产精品入口麻豆电影| 国产精选在线观看| 国产男女av| 国产精品一区二三区| 久久久久久77777| 九九在线免费视频| 久草福利资源在线视频| www.操操操.com| jizz亚洲| 麻豆精品视频入口| 国内精品一区视频| 91av久久| 国产福利图片| 四虎影院成人| 久久国产精品久久久久久小说| 热99re久久精品这里都是免费| 亚洲成人福利| 欧美艹逼视频| 国产香蕉免费精品视频| 国产精品国产国产aⅴ| 精品美女调教视频| av日韩国产| 国产中文字幕网| 国产日本视频| 亚洲图区综合| 黄网址在线播放免费| 国产欧美日韩第一页| 中文字幕4区| 九九热视频免费在线观看| 中文字幕国产欧美| 精品福利视频导航大全| 免费在线观看a| 国产亚洲精品午夜高清影院| 亚洲精品影视在线| 国产一级性片| av中文天堂在线| 国产视频三区| 欧美日韩视频精品二区| 国产精品第八页| 青草视频在线播放| 2019中文字幕视频| 天天av天天爽| 免费不卡中文字幕视频| 依依成人在线| 91九色在线看| 国产素人视频在线观看| 日本成人免费网站| 在线免费国产| 91极品在线| 精品一二三四| 国产高清在线| 国产精品免费视频一区一| 青青久在线视频免费观看| 亚洲an天堂an在线观看| 国产激情自拍| 国产精品粉嫩av| 国产二区三区四区| 国产精品视频一区二区久久| 中文字幕有码在线视频| 日本在线观看| 美女av在线播放| 免费精品国产自产拍观看| 超碰在线国产| 天天操天天艹| 国产视频三区| 992tv在线观看在线播放| 精品国产丝袜高跟鞋 | 国产高清免费av在线| 黄色片视频在线观看| 国产主播色在线| 国产天堂资源| 伊人永久在线| 欧美性受xxxx免费视频| 狂野欧美性猛交xxxx乱大交| 免费a级人成a大片在线观看| 国产原创在线播放| 国产精品入口麻豆免费看| 国产精品爱久久久久久久小说| 国产一区电影| 中文字幕av免费| 九九在线观看免费视频| 国产福利片在线| 另类专区欧美| 国产精品久久久精品a级小说| 国产福利在线观看| 人人干在线视频| 国产精品va在线观看视色| 天堂中文在线观看| 国产一区二区三区福利| www.eeuss影院| 国产三级在线免费观看| a中文在线播放| 国产三级视频在线播放线观看| 亚洲欧美精品日韩欧美| 国产偷窥洗澡视频| 免费a在线看| 91www在线观看| 国产一级又黄| 全网国产福利在线播放| 国产精品久久麻豆| 国产免费电影网站入口| 人人干人人插| 精品伦理一区二区| 国产精品伦理一区二区三区| 久久99亚洲网美利坚合众国| 亚洲综合激情六月婷婷在线观看 | 88av在线| 天堂中文在线观看| 国产黄色大片在线观看| 国产资源在线看| 毛片网站在线观看| 亚洲精品自拍区在线观看| 精品久久av| 国产激情视频在线| 中文字幕在线资源| 91超碰在线免费| 天堂亚洲精品| 国产在线观看色| 久久五月精品| 国产中文字幕在线观看| 久草电影在线| 最新亚洲精品国自产在线观看| 国精一区二区三区| sm国产在线调教视频| 日本韩国精品一区二区| 天天插天天狠天天透| 青青久在线视频免费观看| 另类视频在线| 国产一级性片| 精品入口麻豆传煤| 天天插天天射| 国产在线免费观看| 九九99精品| 国产午夜精品一区理论片| 尤物视频在线观看| 97视频在线| 欧洲有码在线视频| 国产一级网站视频在线| 国产日产一区二区三区| 精品视频三区| 开心婷婷激情| 国产成人天天5g影院| 天天草天天操| 国产女主播在线观看| 亚洲人成电影| 国产三级香港三韩国三级| 在线视频观看国产| 91超碰在线免费| 亚洲激情丁香| 18 激情视频在线| 国产原创精品视频| 99精品老司机免费视频| 黄色av免费看| 中文产幕区在线观看| 黄色一级视频网站| 在线中文字幕第一页|