C++中內存分配和釋放的函數

c語言的標準內存分配函數有:malloc,calloc,realloc,free等。

c++的內存分配和釋放函數爲new和delete。

下面對alloca、malloc、calloc、realloc等函數進行詳細說明。

alloca是向棧申請內存,無需進行釋放。

malloc分配的內存是位於堆中的,且沒有初始化內存中的內容,可以調用memset函數來初始化這部分的內存空間。

calloc會初始化所分配的內存,並且初始化爲0.

realloc函數對malloc申請的內存進行大小的調整。

三個函數的聲明分別爲:

void* malloc(unsigned size);

void* realloc(void* ptr,unsigned newsize);

void* calloc(size_t num,size_t size);

區別:

1、函數malloc不能初始化所分配的內存空間,而函數calloc能。如果由malloc()函數分配的內存空間原來沒有被使用過,則其中的每一位可能都是0;

反之,如果這部分內存曾經被分配過,則其中可能遺留有曾經的數據。換句話說,使用malloc()函數的程序剛開始時(內存空間還沒有被重新分配)

能正常進行,但進過一段時間(內存空間已經被重新分配)可能會出現問題。

2、函數calloc會將所分配的內存空間都初始化爲0 ,也就是說,如果是給字符類型或者整數類型的元素分配內存,那麼這些元素會被初始化爲0;

如果是爲指針類型的元素分配內存,那這些元素會被初始化爲空指針;如果是爲實型數據分配內存,則這些元素會被初始化爲浮點型的零。

3、函數malloc向系統申請分配指定size個字節的內存空間。返回類型是 void*類型.void*表示未確定類型的指針.C,C++規定,void* 類型可以強制轉換爲任何其它類型的指針.

4、realloc可以對給定的指針所指的空間進行擴大或者縮小,無論是擴張或是縮小,原有內存的中內容將保持不變.當然,對於縮小,則被縮小的那一部分的內容會丟失.realloc並不保證調整後的內存空間和原來的內存空間保持同一內存地址.相反,realloc返回的指針很可能指向一個新的地址.

5、realloc是從堆上分配內存的.當擴大一塊內存空間時,realloc()試圖直接從堆上現存的數據後面的那些字節中獲得附加的字節,如果能夠滿足,自然天下太平;如果數據後面的字節不夠,問題就出來了,那麼就使用堆上第一個有足夠大小的自由塊,現存的數據然後就被拷貝至新的位置,而老塊則放回到堆上.這句話傳遞的一個重要的信息就是數據可能被移動.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章