1. 程式人生 > 其它 >【專業技術第十三講】指標和記憶體洩露

【專業技術第十三講】指標和記憶體洩露

存在問題:

指標是大家最為頭痛的問題,也是程式bug中較難解決的錯誤,什麼情況下會導致記憶體洩露?

解決方案:

引言

對於任何使用C語言的人,如果問他們C語言的最大煩惱是什麼,其中許多人可能會回答說是指標和記憶體洩漏。這些的確是消耗了開發人員大多數除錯時間的事項。指標和記憶體洩漏對某些開發人員來說似乎令人畏懼,但是一旦您瞭解了指標及其關聯記憶體操作的基礎,它們就是您在 C 語言中擁有的最強大工具。

本文將與您分享開發人員在開始使用指標來程式設計前應該知道的祕密。本文內容包括:

  • 導致記憶體破壞的指標操作型別
  • 在使用動態記憶體分配時必須考慮的檢查點
  • 導致記憶體洩漏的場景

如果您預先知道什麼地方可能出錯,那麼您就能夠小心避免陷阱,並消除大多數與指標和記憶體相關的問題。

什麼地方可能出錯?

有幾種問題場景可能會出現,從而可能在完成生成後導致問題。在處理指標時,您可以使用本文中的資訊來避免許多問題。

常見的記憶體錯誤及其對策如下:

1、記憶體分配未成功,卻使用了它

程式設計新手常犯這種錯誤,因為他們沒有意識到記憶體分配會不成功。常用解決辦法是,在使用記憶體之前檢查指標是否為NULL。如果指標p是函式的引數,那麼在函式

的入口處用assert(p!=NULL)進行檢查。如果是用malloc或new來申請記憶體,應該用if(p==NULL) 或if(p!=NULL)進行防錯處理。

2、記憶體分配雖然成功,但是尚未初始化就引用它

  犯這種錯誤主要有兩個起因:一是沒有初始化的觀念;二是誤以為記憶體的預設初值全為零,導致引用初值錯誤(例如陣列)。

記憶體的預設初值究竟是什麼並沒有統一的標準,儘管有些時候為零值,我們寧可信其無不可信其有。所以無論用何種方式建立陣列,都別忘了賦初值,即便是賦零

值也不可省略,不要嫌麻煩。

3、記憶體分配成功並且已經初始化,但操作越過了記憶體的邊界

例如在使用陣列時經常發生下標“多1”或者“少1”的操作。特別是在for迴圈語句中,迴圈次數很容易搞錯,導致陣列操作越界。

4、忘記了釋放記憶體,造成記憶體洩露

含有這種錯誤的函式每被呼叫一次就丟失一塊記憶體。剛開始時系統的記憶體充足,你看不到錯誤。終有一次程式突然死掉,系統出現提示:記憶體耗盡。

未初始化的記憶體

在本例中,p 已被分配了 10 個位元組。這 10 個位元組可能包含垃圾資料,如圖 1 所示。

char *p = malloc ( 10 );

圖 1. 垃圾資料

如果在對這個 p 賦值前,某個程式碼段嘗試訪問它,則可能會獲得垃圾值,您的程式可能具有不可預測的行為。p 可能具有您的程式從未曾預料到的值。

良好的實踐是始終結合使用 memsetmalloc,或者使用 calloc

char *p = malloc (10);
memset(p,’