C語言動態和靜態記憶體分配
一. 概念:
1. 靜態分配:
編譯器在處理程式原始碼時分配.
2. 動態分配:
程式執行時按動態要求分配.
※ (1). 靜態分配效率高, 動態分配靈活性高.
(2). 靜態物件都是有名字的變數, 我們直接對其操作, 而動態物件是沒有名字的變數, 我們是用指標間接地對它進行操作.
(3). 靜態物件的分配與釋放由編譯器進行處理, 動態物件必須由程式設計師顯式的管理, 相對來說較易出錯.
二. 分配動態記憶體函式:
1. C: 標頭檔案: <stdlib.h> C++:無須標頭檔案
釋放: free() 釋放: delete 分配: malloc() 分配: new
能直接釋放, 如:free(p); 三種用法對應的釋放方式: (1). int* p = new int ; 對應=> delete p ;
(2).int
(3).int* p = new int(5); 對應=> delter p ;
定義: int*p = (int*)malloc( sizeof(int) ) ; 定義: int* p = new int
int* p = (int*)malloc( sizeof(int)*100 ) ; int* p =new int[100] ;
初始化: 無法初始化. 初始化: int* p = new int(100); ==>兩串: int* p = new; p = 100 ;
使用: 不需調任何函式. 使用: new需要呼叫建構函式, delete需呼叫析構.
(1). malloc():
函式原形: void* malloc( unsigned int size );
說明: ①. size這個引數的含義是分配的記憶體的大小(以位元組為單位).
②. 返回值: 失敗, 則返回值是NULL(空指標).成功, 則返回值是一個指向空型別(
成功, 則返回值是一個指向空型別(void)的指標, 即所分配記憶體塊的首地址.
(2). free():在分配了動態記憶體以後, 如果不釋放(free), 就會引起記憶體洩露.三. 野指標:
1. 定義: 不是”NULL”指標, 是指向”垃圾”或不確定位置的記憶體的指標.
2. 有三種情況會出現野指標:
(1). 指標變數沒有被初始化.
(2). 指標p被free或delete之後, 沒有置為NULL, 讓人誤以為p是個合法的指標. (3). 指標操作超越了變數的作用範圍(不易發現).
四. 記憶體洩露(memory leak):
指一塊動態分配的記憶體, 我們不再擁有指向這塊記憶體的指標, 因此我們沒有辦法將它返回給程式供以後重新使用.
char * p=(char *)malloc(sizeof(char )*100); // ① // 還未釋放.
p = ”123”; // ② 記憶體洩露
puts(p);
free(p); // 崩潰(free只能釋放堆區的資料, 不能釋放資料區的資料).
注意: 1. 如果函式行參是一個指標, 不要指望用該指標去申請動態記憶體.
2. 指標消亡了, 並不代表它指的記憶體會被自動釋放, 記憶體被釋放了, 並不表示指標會消亡或者成了空指標.
3. 在使用malloc後, 必須要free.