指標空間的申請與釋放

2022-08-09 02:30:13 字數 2451 閱讀 1477

一、malloc()和free()的基本概念以及基本用法:

1、函式原型及說明:

void *malloc(long numbytes):該函式分配了numbytes個位元組,並返回了指向這塊記憶體的指標。如果分配失敗,則返回乙個空指標(null)。

關於分配失敗的原因,應該有多種,比如說空間不足就是一種。

char *ptr = null; ptr = (char *)malloc(100 * sizeof(char)); if (null == ptr) gets(ptr);

void free(void *firstbyte): 該函式是將之前用malloc分配的空間還給程式或者是作業系統,也就是釋放了這塊記憶體,讓它重新得到自由。

free(ptr); ptr = null; // code...

free()到底釋放了什麼?這個問題比較簡單,其實我是想和第二大部分的題目相呼應而已!哈哈!free()釋放的是指標指向的記憶體!注意!釋放的是記憶體,不是指標!這點非常非常重要!指標是乙個變數,只有程式結束時才被銷毀。釋放了記憶體空間後,原來指向這塊空間的指標還是存在!只不過現在指標指向的內容的垃圾,是未定義的,所以說是垃圾。因此,前面我已經說過了,釋放記憶體後把指標指向null,防止指標在後面不小心又被解引用了。非常重要啊這一點! 就是這樣!當然,具體情況要具體分析以及具體解決。比如說,你定義了乙個指標,在乙個函式裡申請了一塊記憶體然後通過函式返回傳遞給這個指標,那麼也許釋放這塊記憶體這項工作就應該留給其他函式了。

3、關於函式使用需要注意的一些地方:

a、申請了記憶體空間後,必須檢查是否分配成功。

b、當不需要再使用申請的記憶體時,記得釋放;釋放後應該把指向這塊記憶體的指標指向null,防止程式後面不小心使用了它。

c、這兩個函式應該是配對。如果申請後不釋放就是記憶體洩露;如果無故釋放那就是什麼也沒有做。釋放只能一次,如果釋放兩次及兩次以上會

出現錯誤(釋放空指標例外,釋放空指標其實也等於啥也沒做,所以釋放空指標釋放多少次都沒有問題)。

d、雖然malloc()函式的型別是(void *),任何型別的指標都可以轉換成(void *),但是最好還是在前面進行強制型別轉換,因為這樣可以躲過一

些編譯器的檢查。

好了!最基礎的東西大概這麼說!現在進入第二部分:

一、定義指標的時候一定要初始化。

變數定義的時候給變數初始化,這是保證不出錯的乙個很好的習慣。尤其是在指標的使用上,如果我們沒有給指標初始化,就會出現野指標,該指標的指向並不是我們所希望的,一旦錯誤的釋放了這個指標,就會發生記憶體的訪問。那麼如何初始化指標變數呢,一般有以下幾種方法:

1、初始化空指標

int* pinteger=null;

2、用已有的變數初始化

int length=5;

int* pinteger=&length;

3、用記憶體分配函式給指標分配空間

int* pinteger=(int*)malloc(10*sizeof(int));//為指標分配大小為10個整數的記憶體空間。

二、正確的申請和釋放記憶體

指標使用之後,如果不釋放指標所使用的記憶體,就會造成記憶體的洩露,這樣就會有大量記憶體由於沒能釋放,別的程式不可以使用這部分記憶體,如果乙個程式不停申請記憶體而不去釋放記憶體,很快就會造成系統的崩潰。那麼如何正確的申請和釋放記憶體呢。

1、指標初始化,上面已講

2、正確的申請記憶體

如何申請記憶體才算是正確的申請記憶體呢?首先要判斷指標是否為空,如果不為空,則釋放該指標所指向的記憶體塊,如果不釋放這塊記憶體,而直接就申請記憶體,就會造成記憶體的洩露。申請記憶體後,一定要判斷是否申請成功。

如:int* pinteger=null;//指標定義處

...if(pinteger != null)

pinteger=(int*)malloc(10*sizeof(int));

if(pinteger != null)

...3、記憶體釋放

程式使用完了指標,一定要記得釋放指標指向的記憶體。釋放後一定要記得設定指標為空指標。因為free函式在釋放指標後,只是單純的釋放了該指標指向的記憶體空間,而沒有將指標賦為空值。所以一定要記得在釋放指標後將指標賦為空值。

如:int* pinteger=null;//指標定義處

...free(pinteger);//釋放指標

pinteger=null; //指標賦為空值

三、使用指標時一定要判斷指標是否為空

在使用指標時一定要判斷指標是否為空,如果為空,則做相應的操作。如果不做判斷,則可能錯誤的使用空指標。

如:char* dest=null;

...strcpy(dest,"string");//如果dest為空則出錯

正確的使用方法為:

if(dest == null)

strcpy(dest,"string");

在指標的使用過程中,基本上要注意的問題就是這些

二級指標的申請與釋放

include using namespace std class a public a cout 建構函式 count cout 備考中科大洋時候看到二級指標的申請與釋放空間,寫個demo來看看,另外這個demo還有乙個用途,就是讓你輸出一下形式的數列是可以用上 建構函式1 建構函式2 建構函式3...

c c記憶體申請與釋放

c 記憶體申請與釋放 new 表示式 string sp new string a value 分配並初始化乙個string物件 string arr new string 10 分配10個預設初始化的string對像 string arr new string 10 十個空的string stri...

C 記憶體申請與釋放

c語言中申請記憶體malloc,釋放記憶體free。c 中申請記憶體new,釋放記憶體delete。include include 注意頭檔名稱 using namespace std intmain 執行結果 關於c語言的記憶體使用方式本文不再贅述。malloc與free不能觸發構造和析構函式,但...