《高質量C 記憶體管理

2021-06-26 23:06:57 字數 1576 閱讀 4008

進入雷區了

記憶體分配方式

1.在靜態儲存區域分配

. 在編譯時就分配好了

(即已經編址

),生命週期是程式整個執行週期

.如全域性                   

變數,static變數.

2.在堆疊上分配

.函式執行期間

,函式內部區域性變數

(包括形參

).函式結束時自動釋放

(堆疊清退

).堆疊                        

記憶體分配運算內置於處理器的指令集中,

效率高.

但分配的記憶體容量有限

,可能出現堆疊溢位.

3.從堆

(heap)

或自由儲存空間空間上分配

,也稱動態記憶體分配

.可以用

malloc()

和free().

動態記憶體的 

生存週期由程式設計師決定.   

一般能用前兩種就不用第三種,

因為動態分配記憶體需要額外開銷:

1.分配時將呼叫作業系統中記憶體管理的堆管理器,要先進行碎片合併

,然後才能分配成功

.當然也有可

能分配不成功.

2.如果動態分配失敗

,需要檢查返回值或者捕獲異常

,需要額外開銷.

3.動態建立的物件可能被刪除多次

,甚至在刪除後還會繼續使用

,或者根本不被刪除

,於是執行是會出 現

」吃」記憶體的現象.

使用記憶體是需要注意的地方,

1.申請記憶體是

,要檢驗是否成功.

如:   p=malloc(....); i

f(null==p)

異常處理.

2.記憶體分配後

,在使用前一定要初始化.

char *str=p;

3.記憶體分配好

,使用前一定得注意分配了多大的記憶體

,防止記憶體越界.

4.動態記憶體的申請與釋放要成對出現.

5.避免釋放了記憶體還繼續使用的情況.

1. return返回了

」棧記憶體」

2. f

ree()了記憶體後

,沒有將指標設定為

null,

產生野指標.

原因:儘管釋放了堆記憶體

,但是指標仍然指向乙個地方

,這個時候指標就成了

」野指標」.

6.多次釋放同一塊記憶體.

若free(p),其中p

不是null,

那麼第一次釋放

p,p就變成了野指標

,第二次釋放

,就釋放了一片 未知

』記憶體』,

問題就來了

.沒有絕世輕功,當真不能隨便進這片雷區!

文中主講了c++中包裝動態分配記憶體的方法,暫且跳過.

這本書c語言的部分在這裡就告一段落了.我相信,不久還會回來,回來糾正之前的錯誤.回來把c++的部分讀完.

《資料結構》!!!!我來了!

C 高質量程式設計點滴

摘自 http www.sudu.cn info html edu c 20070103 236588.html 一 你需要乙個函式將乙個陣列賦值為等差數列,並將會在函式的外部使用他。不合理 int getarray int n return p 合理 void getarray int p,int...

高質量C 程式設計點滴

一 你需要乙個函式將乙個陣列賦值為等差數列,並將會在函式的外部使用它。不合理 int getarray int n return p 合理 void getarray int p,int n 解析 檢查記憶體洩露的最好辦法,就是檢查完全配對的申請和釋放,在函式中申請而在外部釋放,將導致 的一致性變差...

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

沒學過c 所以,主要看了與c相關的,獲益匪淺 總結一下,主要幾點是 1 對於三種記憶體分配方式需要加強了解,各有所長。2 動態申請與釋放一定要配對。3 一定要注意野位址的處理。下面是一些詳細的筆記 第七章 記憶體管理 7.1 記憶體分配方式 這一塊兒自己原本有些許了解,但一直不重視,現在看來,原來自...