進入雷區了
記憶體分配方式:
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 記憶體分配方式 這一塊兒自己原本有些許了解,但一直不重視,現在看來,原來自...