其中一道很基礎的問題是問c和c++在動態記憶體分配,釋放方面的區別。作為乙個勵志成為c和c++軟體開發人員,居然連這個問題都解答的含糊不清,深感慚愧,這才認真總結一番。
一、先來談談在c語言下,動態記憶體分配和釋放的特點。
動態分配記憶體的定義是這樣的,指在程式執行過程中,要申請記憶體,系統會根據程式的實際情況來分配,分配空間的大小是由程式的需求來決定的。在c語言下面,舉個例子,定義乙個指標,int *p;此時指標i是乙個野指標,是乙個指向不確定位置的指標,對它進行操作是很危險的,此時我們需要動態分配記憶體空間,讓i指向它。而有一種形式是這樣的,int *p=&b;這並非是一種動態記憶體分配方式,而是一種指標的初始化,把變數b的首位址給了指標p。在c語言下究竟如何實現動態記憶體分配的呢?這裡提供了幾個函式來實現,分別是malloc(),calloc(),realloc(),而釋放記憶體的函式為free(),分別**他們的異同。
1.malloc函式
函式原型為void *malloc(unsigned int size);在記憶體的動態儲存區中分配一塊長度為"size" 位元組的連續區域。函式的返回值為該區域的首位址。 「型別說明符」表示把該區域用於何種資料型別。(型別說明符*)表示把返回值強制轉換為該型別指標。「size」是乙個無符號數。例如: pc=(char *) malloc (100); 表示分配100個位元組的記憶體空間,並強制轉換為字元陣列型別,函式的返回值為指向該字元陣列的指標, 把該指標賦予指標變數pc。若size超出可用空間,則返回空指標值null。
2.calloc 函式
函式原型為void *calloc(unsigned int num, unsigned int size)
按所給資料個數和每個資料所佔位元組數開闢儲存空間。其中num為資料個數,size為每個資料所佔位元組數,故開闢的總位元組數為num*size。函式返回該儲存區的起始位址。calloc函式與malloc 函式的區別僅在於一次可以分配n塊區域。例如: ps=(struct stu*) calloc(2,sizeof (struct stu)); 其中的sizeof(struct stu)是求stu的結構長度。因此該語句的意思是:按stu的長度分配2塊連續區域,強制轉換為stu型別,並把其首位址賦予指標變數ps。
3. realloc函式:
函式原型為void *realloc(void *ptr, unsigned int size)
*ptr指向的要改變的空間位址,如果size大小的連續的空間,那麼就返回*ptr,如果沒有size大小的空間,那麼就需要重新申請新的連續空間,把之前空間的資料拷貝到新的空間,釋放以前的空間的資料,返回新的位址。
**動態申請的記憶體空間要進行手動用free()函式釋放
4. free函式:
函式原型為void free(void *ptr)
將以前開闢的某記憶體空間釋放。函式原型為 void free(void *ptr)其中ptr為存放待釋放空間起始位址的指標變數,函式無返回值。應注意:ptr所指向的空間必須是前述函式所開闢的。例如free((void *)p1);將上例開闢的16個位元組釋放。可簡寫為free(p1);由系統自動進行型別轉換。
二、c++語言動態記憶體分配
c++語言中用new和delete來動態申請和釋放記憶體。
1. 申請單個物件
int *p;
p=new int;或者 p=new int(value);
2. 動態申請陣列
int *p;
p=new int [100];
這樣可以申請長度為100的陣列,但是不能進行初始化。
3. delete
int *p, *q;
p=new int;
q=new int[10];
delete p;
delete [ ]q;
C和C 動態記憶體分配和釋放的區別
一 先來談談在c語言下,動態記憶體分配和釋放的特點。動態分配記憶體的定義是這樣的,指在程式執行過程中,要申請記憶體,系統會根據程式的實際情況來分配,分配空間的大小是由程式的需求來決定的。在c語言下面,舉個例子,定義乙個指標,int p 此時指標i是乙個野指標,是乙個指向不確定位置的指標,對它進行操作...
C和C 動態記憶體分配和釋放的區別
一 先來談談在 c語言下,動態記憶體分配和釋放的特點。動態分配記憶體的定義是這樣的,指在程式執行過程中,要申請記憶體,系統會根據程式的實際情況來分配,分配空間的大小是由程式的需求來決定的。在 c語言下面,舉個例子,定義乙個指標,int p 此時指標 p是乙個野指標,是乙個指向不確定位置的指標,對它進...
C 動態記憶體的分配和釋放
1,new和delete的基本使用形式。用new用於堆內的記憶體的分配的基本形式 指標變數名 new 型別 1定義乙個整型指標將變數 int p p new int 指標變數名 new 型別名 初值 用delete用於new分配的堆記憶體的釋放 語法形式 delete 運算子例子 include u...