亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

c語言內存泄露示例解析

2020-01-26 15:54:31
字體:
來源:轉載
供稿:網友

正確的內存管理的重要性
存在內存錯誤的 C 和 C++ 程序會導致各種問題。如果它們泄漏內存,則運行速度會逐漸變慢,并最終停止運行;如果覆蓋內存,則會變得非常脆弱,很容易受到惡意用戶的攻擊。從 1988 年著名的莫里斯蠕蟲 攻擊到有關 Flash Player 和其他關鍵的零售級程序的最新安全警報都與緩沖區溢出有關:“大多數計算機安全漏洞都是緩沖區溢出”,Rodney Bates 在 2004 年寫道。

在可以使用 C 或 C++ 的地方,也廣泛支持使用其他許多通用語言(如 Java™、Ruby、Haskell、C#、Perl、Smalltalk 等),每種語言都有眾多的愛好者和各自的優點。但是,從計算角度來看,每種編程語言優于 C 或 C++ 的主要優點都與便于內存管理密切相關。與內存相關的編程是如此重要,而在實踐中正確應用又是如此困難,以致于它支配著面向對象編程語言、功能性編程語言、高級編程語言、聲明性編程語言和另外一些編程語言的所有其他變量或理論。

與少數其他類型的常見錯誤一樣,內存錯誤還是一種隱性危害:它們很難再現,癥狀通常不能在相應的源代碼中找到。例如,無論何時何地發生內存泄漏,都可能表現為應用程序完全無法接受,同時內存泄漏不是顯而易見。

因此,出于所有這些原因,需要特別關注 C 和 C++ 編程的內存問題。讓我們看一看如何解決這些問題,先不談是哪種語言。

內存錯誤的類別
首先,不要失去信心。有很多辦法可以對付內存問題。我們先列出所有可能存在的實際問題:

•內存泄漏
•錯誤分配,包括大量增加 free() 釋放的內存和未初始化的引用
•懸空指針
•數組邊界違規

這是所有類型。即使遷移到 C++ 面向對象的語言,這些類型也不會有明顯變化;無論數據是簡單類型還是 C 語言的 struct 或 C++ 的類,C 和 C++ 中內存管理和引用的模型在原理上都是相同的。以下內容絕大部分是“純 C”語言,對于擴展到 C++ 主要留作練習使用。

內存泄漏
在分配資源時會發生內存泄漏,但是它從不回收。下面是一個可能出錯的模型(請參見清單 1):

清單 1. 簡單的潛在堆內存丟失和緩沖區覆蓋

復制代碼 代碼如下:

void f1(char *explanation) { char *p1; p1 = malloc(100); sprintf(p1,"The f1 error occurred because of '%s'.", explanation); local_log(p1); }

您看到問題了嗎?除非 local_log() 對 free() 釋放內存具有不尋常的響應能力,否則每次對 f1 的調用都會泄漏 100 字節。在記憶棒增量分發數兆字節內存時,一次泄漏是微不足道的,但是連續操作數小時后,即使如此小的泄漏也會削弱應用程序。

在實際的 C 和 C++ 編程中,這不足以影響您對 malloc() 或 new 的使用,本部分開頭的句子提到了“資源”不是僅指“內存”,因為還有類似以下內容的示例(請參見清單 2)。FILE 句柄可能與內存塊不同,但是必須對它們給予同等關注:

清單 2. 來自資源錯誤管理的潛在堆內存丟失

復制代碼 代碼如下:

int getkey(char *filename) { FILE *fp; int key; fp = fopen(filename, "r"); fscanf(fp, "%d", &key); return key; }

fopen 的語義需要補充性的 fclose。在沒有 fclose() 的情況下,C 標準不能指定發生的情況時,很可能是內存泄漏。其他資源(如信號量、網絡句柄、數據庫連接等)同樣值得考慮。

內存錯誤分配
錯誤分配的管理不是很困難。下面是一個錯誤分配示例(請參見清單 3):

清單 3. 未初始化的指針

復制代碼 代碼如下:

void f2(int datum) { int *p2; /* Uh-oh! No one has initialized p2. */ *p2 = datum; ... }

關于此類錯誤的好消息是,它們一般具有顯著結果。在 AIX® 下,對未初始化指針的分配通常會立即導致segmentation fault 錯誤。它的好處是任何此類錯誤都會被快速地檢測到;與花費數月時間才能確定且難以再現的錯誤相比,檢測此類錯誤的代價要小得多。

在此錯誤類型中存在多個變種。free() 釋放的內存比 malloc() 更頻繁(請參見清單 4):

清單 4. 兩個錯誤的內存釋放

復制代碼 代碼如下:

/* Allocate once, free twice. */ void f3() { char *p, *pp; p = malloc(10);
pp=p;
free(p); ... free(pp); } /* Allocate zero times, free once. */ void f4() { char *p;
...
/* Note that p remains uninitialized here. */ free(p); }

這些錯誤通常也不太嚴重。盡管 C 標準在這些情形中沒有定義具體行為,但典型的實現將忽略錯誤,或者快速而明確地對它們進行標記;總之,這些都是安全情形。

懸空指針
懸空指針比較棘手。當程序員在內存資源釋放后使用資源時會發生懸空指針(請參見清單 5):

清單 5. 懸空指針

復制代碼 代碼如下:

void f8() { struct x *xp; xp = (struct x *) malloc(sizeof (struct x)); xp.q = 13; ... free(xp); ... /* Problem! There's no guarantee that the memory block to which xp points hasn't been overwritten. */ return xp.q; }

傳統的“調試”難以隔離懸空指針。由于下面兩個明顯原因,它們很難再現:

•即使影響提前釋放內存范圍的代碼已本地化,內存的使用仍然可能取決于應用程序甚至(在極端情況下)不同進程中的其他執行位置。

•懸空指針可能發生在以微妙方式使用內存的代碼中。結果是,即使內存在釋放后立即被覆蓋,并且新指向的值不同于預期值,也很難識別出新值是錯誤值。

懸空指針不斷威脅著 C 或 C++ 程序的運行狀態。

數組邊界違規
數組邊界違規十分危險,它是內存錯誤管理的最后一個主要類別?;仡^看一下清單 1;如果 explanation 的長度超過 80,則會發生什么情況?回答:難以預料,但是它可能與良好情形相差甚遠。特別是,C 復制一個字符串,該字符串不適于為它分配的 100 個字符。在任何常規實現中,“超過的”字符會覆蓋內存中的其他數據。內存中數據分配的布局非常復雜并且難以再現,所以任何癥狀都不可能追溯到源代碼級別的具體錯誤。這些錯誤通常會導致數百萬美元的損失。

.棘手的內存泄漏

復制代碼 代碼如下:

static char *important_pointer = NULL; void f9() { if (!important_pointer) important_pointer = malloc(IMPORTANT_SIZE); ... if (condition) /* Ooops! We just lost the reference important_pointer already held. */ important_pointer = malloc(DIFFERENT_SIZE); ... }
do not返回局部指針變量或者局部變量的指針,除非是一個static局部變量
char *f0() {     char temp[]="123456789"; //加上static 才是正確的
return temp; }

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美高清自拍一区| 欧美精品手机在线| 欧美二区在线播放| 欧美在线激情视频| 欧美日韩在线一区| 91午夜理伦私人影院| 久久久精品一区二区三区| 色久欧美在线视频观看| 欧美日韩一区二区三区在线免费观看| 国产精品免费小视频| 国产精品18久久久久久首页狼| 国产精品美女久久久久av超清| 在线电影av不卡网址| 中文字幕av一区二区| 欧美黑人一区二区三区| 国产一区二区三区毛片| 欧美激情二区三区| 欧美日韩国产一区中文午夜| 欧美激情一级二级| www.欧美精品一二三区| 国产精品激情av在线播放| 日韩av在线天堂网| 欧美午夜激情视频| 亚洲欧美日韩久久久久久| 国产成人在线视频| 992tv成人免费视频| 一区二区三区www| 成人国产精品免费视频| 国产精品午夜视频| 日韩在线观看免费网站| 91精品国产沙发| …久久精品99久久香蕉国产| 亚洲电影免费观看高清完整版在线| 国产精品欧美日韩一区二区| 欧美另类在线播放| 亚洲jizzjizz日本少妇| 日韩成人中文电影| 欧美理论电影在线观看| 久久久国产精彩视频美女艺术照福利| 亚洲国产精品va在线观看黑人| 国产精品第10页| 尤物tv国产一区| 日韩av高清不卡| 久久久免费观看| 福利视频导航一区| 久久天堂电影网| 日韩福利伦理影院免费| 国产精品第2页| 亚洲第一福利视频| 欧美小视频在线观看| 91精品国产91久久久久久吃药| 久久精品国产亚洲| 国产精品国产三级国产aⅴ9色| 欧美亚洲另类制服自拍| 日韩精品中文字幕视频在线| 日韩av影院在线观看| 欧美猛男性生活免费| 日本高清视频精品| 亚洲国产小视频在线观看| 欧美疯狂性受xxxxx另类| 国产精品一区二区三区成人| 亚洲精品自拍视频| 久久精品国产99国产精品澳门| 91久久精品在线| 欧美在线一区二区三区四| 777国产偷窥盗摄精品视频| 成人深夜直播免费观看| 国产精品扒开腿做| 国产成人97精品免费看片| 国产精品久久久久77777| 日韩欧美a级成人黄色| 91大神福利视频在线| 国产成人精品免费视频| 欧美性精品220| 欧美激情a在线| 大桥未久av一区二区三区| 国产成+人+综合+亚洲欧美丁香花| 精品成人国产在线观看男人呻吟| 国产精品揄拍500视频| 亚洲国产精品va在线看黑人动漫| www.精品av.com| 国产精品久久久久久av福利| 午夜精品一区二区三区av| 国产精品嫩草视频| 中文字幕亚洲二区| 美女999久久久精品视频| 日韩免费黄色av| 国产日韩中文字幕| 在线电影中文日韩| 色中色综合影院手机版在线观看| 成人性生交大片免费看视频直播| 欧美色道久久88综合亚洲精品| 亚洲自拍中文字幕| 2023亚洲男人天堂| 欧美黑人xxx| 97碰在线观看| 97久久精品在线| 亚洲精品乱码久久久久久按摩观| 中文综合在线观看| 精品视频在线导航| 91在线中文字幕| 国产精品视频播放| 亚洲free性xxxx护士白浆| 欧美午夜www高清视频| 久久久久中文字幕2018| 国产免费亚洲高清| 亚洲无限乱码一二三四麻| 亚洲最大激情中文字幕| 国产欧美精品一区二区三区介绍| 日韩中文字幕免费看| 久久视频免费观看| 亚洲尤物视频网| 亚洲男人天堂视频| 久久天天躁狠狠躁夜夜躁2014| 深夜成人在线观看| 国产精品视频xxx| 伦伦影院午夜日韩欧美限制| 日韩成人av网址| 国产精品久久久久久久久久ktv| 久久久精品免费| 国产精品美女在线| 国产精品成人va在线观看| 欧美在线视频观看免费网站| 久久精品久久精品亚洲人| 亚洲视频欧美视频| 91精品一区二区| 国产成人免费91av在线| 亚洲人成免费电影| 国产91色在线播放| 久热在线中文字幕色999舞| 亚洲欧洲一区二区三区久久| 亚洲最大在线视频| 欧美一级视频在线观看| 欧美日韩中文在线| 欧美成人四级hd版| 欧美特黄级在线| 久久精品国产96久久久香蕉| 成人午夜黄色影院| 国语自产精品视频在线看抢先版图片| 91精品视频在线看| 国外色69视频在线观看| 日韩高清电影好看的电视剧电影| 亚洲电影免费观看高清完整版| 国产999精品久久久影片官网| 欧美性少妇18aaaa视频| 国产精品国产亚洲伊人久久| 色婷婷久久av| 国产成人久久久精品一区| 亚洲欧美日韩一区二区在线| 欧美激情视频一区二区三区不卡| 久久久久久久999| 91精品国产九九九久久久亚洲| 亚洲国产精品国自产拍av秋霞| 欧美激情二区三区| 色婷婷av一区二区三区在线观看| 久久久久久国产精品久久| 国产日产久久高清欧美一区| 欧美午夜精品久久久久久久| 在线观看亚洲视频| 国产一区二区三区三区在线观看| 久久精品亚洲94久久精品| 久久久av电影| 久久99视频精品| 高清一区二区三区四区五区|