在C++中,我們通過new(在動態內存中為對象分配空間并初始化對象)和delete(銷毀該對象,并釋放內存)直接分配和釋放動態內存。下面西安達內c++培訓(http://www.xatarena.net)講師就詳細為大家介紹c++動態內存的使用注意事項。
1、如果有足夠空間用于擴大mem_address指向的內存塊,則分配額外內存,并返回mem_address
這里說的是“擴大”,我們知道,realloc是從堆上分配內存的,當擴大一塊內存空間時, realloc()試圖直接從堆上現存的數據后面的那些字節中獲得附加的字節,如果能夠滿足,自然天下太平。也就是說,如果原先的內存大小后面還有足夠的空閑空間用來分配,加上原來的空間大小= newsize。那么就ok。得到的是一塊連續的內存。
2、如果原先的內存大小后面沒有足夠的空閑空間用來分配,那么從堆中另外找一塊newsize大小的內存。
并把原來大小內存空間中的內容復制到newsize中。返回新的mem_address指針。(數據被移動了)。
老塊被放回堆上。
例如:
#include <malloc.h>
char *p,*q;
p = (char * ) malloc (10);
q=p;
p = (char * ) realloc (p,20);
…………………………
這段程序也許在編譯器中沒有辦法通過,因為編譯器可能會為我們消除一些隱患!在這里我們只是增加了一個記錄原來內存地址的指針q,然后記錄了原來的內存地址p,如果不幸的話,數據發生了移動,那么所記錄的原來的內存地址q所指向的內存空間實際上已經放回到堆上了!這樣一來,我們應該終于意識到問題的所在和可怕了吧!
3、返回情況
返回的是一個void類型的指針,調用成功。(這就再你需要的時候進行強制類型轉換)
返回NULL,當需要擴展的大小(第二個參數)為0并且*一個參數不為NULL,此時原內存變成了“freed(游離)”的了。
返回NULL,當沒有足夠的空間可供擴展的時候,此時,原內存空間的大小維持不變。
4、特殊情況
如果mem_address為nell,則realloc()和malloc()類似。分配一個newsize的內存塊,返回一個指向該內存塊的指針。
如果newsize大小為0,那么釋放mem_address指向的內存,并返回null。
如果沒有足夠可用的內存用來完成重新分配(擴大原來的內存塊或者分配新的內存塊),則返回null.而原來的內存塊保持不變。 |
 |
|