一、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不能觸發構造和析構函式,但...