1. 程式人生 > >C語言動態和靜態記憶體分配

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

* p = new int[5]; 對應=> delete []p ;  // ([]內不用填)

                                                                                                                        (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.