c++ 整合 new 和 delete 操作進行動態記憶體分配,但是在 c 語言中無效。
c 語言中使用函式庫來解決,即在頭(在 c 中稱為)中定義的函式:malloc,calloc ,realloc,free 。
這些函式在 c++ 中依然有效。但是使用上面函式分配的記憶體塊和用 new 返回的並不一定相容,不要混用,他們應當在各自的函式集或操作中使用。
(1) 函式 malloc
這個函式是給指標動態分配記憶體,原型:
void* malloc (nbytes);
其中nbytes 是我們想要給指標分配的記憶體位元組數。這個函式返回乙個void*型別的指標,因此我們需要用型別轉換(type cast)來把它轉換成目標指標所需要的資料型別,例如:
char* a;
a = (char*)malloc (20);
這個例子將乙個指向20個位元組可用空間的指標賦給 a 。當我們想給一組除 char 以外的型別(不是1位元組長度的)的數值分配記憶體的時候,我們需要用元素數乘以每個元素的長度來確定所需記憶體的大小。操作符 sizeof ,它可以返回乙個具體資料型別的長度。
int* b;
b = (int*)malloc (10 * sizeof(int));
這一段**將乙個指向可儲存10個 int 型整數的記憶體塊的指標賦給 b ,它的實際長度可能是 2,4或更多位元組數,這取決於程式是在什麼作業系統下被編譯的。
(2) 函式 calloc
calloc 與 malloc 在操作上非常相似,他們主要的區別是在原型上:
void* calloc (nelements, sizes);
calloc 有兩個引數,第乙個 nelements 表示元素個數,第二個 sizes 表示 每個元素長度,這兩個引數相乘被用來計算所需記憶體塊的總長度。
如,我們可以這樣定義上面的指標 b :
int* b;
b = (int*)calloc (2, sizeof(int));
malloc 和 calloc 的另一點不同在於 calloc 會將所有的元素初始化為0。
(3) 函式 realloc
它被用來
改變已經被分配給乙個指標的記憶體的長度。
void* realloc (void* pointer, nbytes);
引數 pointer 用來傳遞乙個已經被分配記憶體的指標或乙個空指標,而引數 nbytes 用來指明新的記憶體長度。這個函式給指標分配nbytes 位元組的記憶體。這個函式可能需要改變記憶體塊的位址以便能夠分配足夠的記憶體來滿足新的長度要求。在這種情況下,指標當前所指的記憶體中的資料內容將會被拷貝到新的位址中,以保證現存資料不會丟失。函式返回新的指標位址。如果新的記憶體尺寸不能夠被滿足,函式將會返回乙個空指標,但原來引數中的指標pointer 及其內容保持不變。
(4) 函式 free
這個函式用來釋放被前面 malloc , calloc 或 realloc 所分配的記憶體塊。
void* free (void* pointer);
pointer 用來傳遞乙個要被釋放的已分配記憶體的指標。
在這裡要特別注意:這個函式只能被用來釋放由函式malloc, calloc 和realloc所分配的空間。
C 動態記憶體的分配和釋放
1,new和delete的基本使用形式。用new用於堆內的記憶體的分配的基本形式 指標變數名 new 型別 1定義乙個整型指標將變數 int p p new int 指標變數名 new 型別名 初值 用delete用於new分配的堆記憶體的釋放 語法形式 delete 運算子例子 include u...
C和C 動態記憶體分配和釋放的區別
一 先來談談在c語言下,動態記憶體分配和釋放的特點。動態分配記憶體的定義是這樣的,指在程式執行過程中,要申請記憶體,系統會根據程式的實際情況來分配,分配空間的大小是由程式的需求來決定的。在c語言下面,舉個例子,定義乙個指標,int p 此時指標i是乙個野指標,是乙個指向不確定位置的指標,對它進行操作...
C和C 動態記憶體分配和釋放的區別
一 先來談談在 c語言下,動態記憶體分配和釋放的特點。動態分配記憶體的定義是這樣的,指在程式執行過程中,要申請記憶體,系統會根據程式的實際情況來分配,分配空間的大小是由程式的需求來決定的。在 c語言下面,舉個例子,定義乙個指標,int p 此時指標 p是乙個野指標,是乙個指向不確定位置的指標,對它進...