讀《高質量的C C 程式設計》(二) 記憶體管理

2021-06-03 03:24:07 字數 2827 閱讀 3241

沒學過c++,所以,主要看了與c相關的,獲益匪淺

總結一下,主要幾點是:

1、對於三種記憶體分配方式需要加強了解,各有所長。

2、動態申請與釋放一定要配對。

3、一定要注意野位址的處理。

下面是一些詳細的筆記:

第七章 記憶體管理

7.1 記憶體分配方式

這一塊兒自己原本有些許了解,但一直不重視,現在看來,原來自己太幼稚了。

1、靜態儲存區域分配。編譯時分配,程式整個執行期間都存在,如全域性變數和static變數

2、棧上建立。函式執行時,函式內部變數建立,效率高,但分配的記憶體容量有限。

3、堆上分配,即動態記憶體分配。用malloc和new申請任意記憶體,用free和delete釋放記憶體,生存期由自己決定,靈活方便,但問題也最多。

7.2 常見的記憶體錯誤及其對策

發生記憶體錯誤最麻煩的莫過於需要到執行時才能捕捉到……

1、記憶體分配未成功,卻使用了它(自己偶爾會不對分配成功與否進行檢查)。

解決方案:

在使用前檢查指標是否為null。如果指標p是函式的引數,那麼在函式的入口處用assert(p!=null)進行檢查。如果是用malloc或new來申請記憶體,應該用if(p==null) 或if(p!=null)進行防錯處理。

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

記憶體的預設值沒有統一標準,所以,一定要初始化。

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

4、忘記釋放記憶體,造成記憶體洩露。(這是自己經常犯的錯,mark一下)

動態申請與釋放必須配對。

5、釋放了記憶體卻繼續使用

1、程式太過混亂造成。重新設計資料結構吧,親

2、return語句寫錯了。不能返回「棧記憶體」的指標或引用,會被自動釋放掉的

3、free或delete後,需要將指標設定為null,防止產生「野位址」。

注意:1、用malloc或new申請記憶體之後,應該立即檢查指標值是否為null。防止使用指標值為null的記憶體。

2、不要忘記為陣列和動態記憶體賦初值。防止將未被初始化的記憶體作為右值使用。

3、避免陣列或指標的下標越界,特別要當心發生「多1」或者「少1」操作。

4、動態記憶體的申請與釋放必須配對,防止記憶體洩漏。

5、用free或delete釋放了記憶體之後,立即將指標設定為null,防止產生「野指標」。

7.3 指標與陣列的對比

1、陣列在靜態儲存區或棧上建立,對應著一塊記憶體,位址與容量保持不變。

2、指標可以指向任意記憶體塊,是「可變」的,靈活但危險。

3、內容:

1、char a = "hello";  //a是乙個字串變數,內容為hello\0,可以修改;

2、char *p = "hello";   //p指向的是乙個常量字串,不能修改。

4、陣列與指標的複製、賦值不同。

5、計算記憶體容量。

1、用sizeof可以計算出字串長度。不能得出指標所指內容的長度,只能在申請的時候知道其長度。

2、對字元陣列,sizeof與strlen不同,要注意。

6、若函式引數是乙個指標,不能用這個指標去申請動態記憶體。

*、因為編譯器會給每個引數製作臨時副本,修改的事引數的臨時副本的值。

*、若必須用指標去申請記憶體,引數應該用指標的指標。

*、用函式返回值來傳遞動態記憶體。但切記不能返回指向「棧記憶體」的指標。

自己實驗發現str = getstring語句後,str的內容跟getstring裡賦值一樣……

7、free和delete把指標怎麼了?

free和delete只是把指向的記憶體給釋放掉,本身位址仍存在,指標成為「野指標」,必須對其進行處理,p = null。

8、動態記憶體會被自動釋放嗎?

指標消亡了,指向的記憶體並不一定會被自動釋放。

記憶體釋放了,並不表示指標會消亡或成為null指標。

9、杜絕「野指標」。

產生:1.指標變數未初始化。

2.指標被free或delete後沒設定為null。

3.指標操作超過了變數的作用範圍。

10、malloc/free與new/delete

11、記憶體耗盡怎麼辦?  此時分配記憶體會失敗,返回null指標。

解決方案:

1.判斷是否為null,用return結束函式。

2.判斷是否為null,用exit(1)結束整個程式的執行。

3.為new和malloc編寫異常處理函式。

對32位以上的應用程式,不可能導致「記憶體耗盡」,因為支援虛存。

12、malloc/free的使用要點。

void * malloc (size_t size);

1.malloc返回值是void *,所以,呼叫時必須顯示地進行型別轉換,轉換為所需的指標型別。

2.不同資料型別在不同系統下所佔空間大小不一樣,所以,在malloc中要善於用sizeof。

void free(void * memblock);

1.若p不是null型變數,連續進行兩次及以上就會造成執行錯誤。

讀《高質量C C程式設計指南》

林銳的本書我再一年多以前看過這本書,印象最深的是這本書的附錄 大學十年 如果把寫 想象為搭積木,那麼用一句話描述這本書的內容就是,我們要對 c c 語言這個小積木瞭如指掌,用它們組合成我們想要的圖形,其中不能有任何縫隙。問題產生原因 我們習慣了人與人之間可以含混的語言,原因在於人的糾錯能力太強了。但...

高質量程式設計C C

一 請填寫bool float,指標變數與 零值 比較的 if 語句。10 分 請寫出 bool flag 與 零值 比較的 if 語句。3 分 標準答案 if flag if flag 如下寫法均屬不良風格,不得分。if flag true if flag 1 if flag false if f...

高質量c c 程式設計

第1章 為防止標頭檔案被重複引用,應當用 ifndef define endif 結構產生預處理塊 使用 include引用標準庫標頭檔案,使用 include filename.h 引用非標準庫標頭檔案 標頭檔案中只存放 宣告 不存放 定義 第2章 應在關聯性不強的語句間新增空行 一行 只做一件事...