1.new與delete運算
c++提供了兩個中重要的運算子:new和delete。由於他們是運算子不是函式,因此執行效率更高。
運算子功能
目結合性
用法new
動態分配
單目自右向左
new type
new動態分配陣列
單目自右向左
new type
delete
釋放空間
單目自右向左
delete expr
delete
釋放陣列空間
單目自右向左
delete expr
new 運算子將在自由儲存區中動態分配記憶體,建立物件,一般形式為:
(1)分配指定型別的記憶體空間,且指定初值:
new 型別
(2)分配指定型別的記憶體空間,且指定初值:
new 型別(初值)
(3)分配乙個(一維或多維陣列):
new 型別[常量表示式]…
new運算結果是指向分配得到的記憶體空間的指標,如果沒有足夠的記憶體空間可以分配,其運算結果是乙個0值指標。
例如
int
*p1,p2;
char
*pz1,
*pz2;
p1=new
int;
//分配乙個整形空間,若成功則p1指向該空間,否則p1為null
p2=new
int(10)
;//分配乙個整形空間,且給整個整形賦初值10,即*p2為10
pz1=
newchar[80
];//分配乙個字元陣列(字串)空間,即pz1為字串指標
pz2=
newchar[5
][80]
;//分配乙個二維字串(字串陣列)空間,即pz1為字串陣列指標
delete運算子釋放記憶體返回給自右儲存區,銷毀物件,一般形式為
(1)釋放已分配的記憶體空間
delete 指標表示式
(2)釋放已分配的陣列記憶體空間
delete 指標表示式
delete運算釋放指標所指向的記憶體空間,第(3)種new形式分配的陣列記憶體空間需要用第(2)種delete形式來釋放。
例如:
delete p1;
//釋放p1指向的整形空間
delete
pz1;
//釋放pz1指向的字串空間
delete
pz2;
//釋放pz2指向的字串陣列空間
銷毀物件後,指標p1變得沒有定義,然而它仍然存在先前所指向的物件(已銷毀)的位址,因此指標p1不再有效,成這樣的指標為懸垂指標。懸垂指標指向曾經有效的物件記憶體,但該物件已經不再存在。使用垂懸指標往往導致程式錯誤,而且很難檢測出來糖廠在delete運算之後將指標重設為0值指標,避免垂懸指標。
用new建立的動態物件使用完之後,必須用delete銷毀。若是0值指標,delete運算不起任何作用。
int
*p=0
;delete p;
//使用正確,無意義
//delete只刪除由new建立的動態物件,否則將導致程式錯誤。例如:
int a,
*p=&a,
*p1;
string str=
"hello"
;p1=
newint
(100);
delete p1;
//正確
delete str;
//錯誤,str不是動態物件
delete p;
//錯誤,p所指向的a是靜態分配尋出空間的。
2.動態記憶體分配函式
(1)malloc函式
malloc函式用於分配乙個指定大小的記憶體空間,函式原型為:
void *malloc(size_t size);
若分配成功,函式返回乙個指向該記憶體空間起始位址的viod型別指標;若分配失敗,函式返回0值指標null。引數size表示申請分配的位元組數,型別size_t一般為unsigned int。
在實際程式設計中,malloc函式返回的void型別指標可以顯示轉換為其他型別的指標。呼叫函式時,一般使用sizeof來計算記憶體的大小,需要注意的是,分配的到的記憶體空間是未初始化的,即記憶體中的資料不是確定的。
例如
int
*p=(
int)
malloc
(sizeof
(int
))
若分配成功,p指向分配得到的記憶體單元,*p表示該記憶體單元。
(2)calloc函式
calloc函式用於分配n個連續的指定大小的記憶體空間,函式原理為:
void
malloc
(size_t nmemb,size_t size)
每個記憶體空間的大小為size位元組,總位元組數為n*size,並且將分配得到的記憶體空間的位址全部初始化為0.若分配成功,指向分配記憶體空間的起始位址,若失敗,返回0值指標null
例如,分配20個int型別(相當於int p[20])記憶體空間
int
*p=(
int*
)calloc(20
,sizeof
(int))
;等價於
int*p=
(int*)
malloc(20
*sizeof
(int))
;
3、動態記憶體的調整函式
realloc函式用於調整已分配記憶體空間的大小,函式原型為:
void
*realloc
(void
*ptr,size_t size)
;
realloc將指標ptr所指向的動態記憶體空間擴大或者縮小為size大小,無論擴大或者縮小,原記憶體中的餓內容不變。縮小空間會丟失縮小的那部分內容(假如記憶體縮小為原來的一般,則原來位址的後半部分消失;如果增加也是增加到原來位址的後半部分),
例如:
int
*p;p=
(int*)
malloc(20
*sizeof
(int))
;p=(int*)
realloc(10
*sizeof
(int))
;p=(int*)
realloc(60
*sizeof
(int))
;
4、動態記憶體釋放函式
free函式用來釋放動態分配的記憶體空間,函式原型為:
/*ptr指向已有的動態記憶體空間,如果ptr為空,什麼操作也不執行*/
void
free
(void
*ptr)
;
在實際程式設計中,若某個動態分配的記憶體不再使用時,應該及時將其釋放。在動態分配的記憶體釋放後,就不能再通過指標去訪問,否則會導致程式出現崩潰。
通常,ptr釋放後,需要設定ptr為null,避免產生「迷途指標」。
int
*p;p=
(int*)
malloc
(sizeof
(int))
;free
(p);
p=null
;
C語言之動態記憶體分配與釋放
1,堆記憶體特點 堆記憶體可以存放任意型別的資料,但需要自己申請與釋放。2,堆大小 堆大小,想像中的無窮大,但實際使用中,受限於實際記憶體的大小和記憶體是否有連續性。1,malloc函式 2,calloc函式 3,realloc函式 4,free函式 示例 include include int m...
C 動態記憶體的分配和釋放
1,new和delete的基本使用形式。用new用於堆內的記憶體的分配的基本形式 指標變數名 new 型別 1定義乙個整型指標將變數 int p p new int 指標變數名 new 型別名 初值 用delete用於new分配的堆記憶體的釋放 語法形式 delete 運算子例子 include u...
動態記憶體建立與釋放
使用時應加上標頭檔案 include 一.申請動態記憶體 申請動態記憶體 malloc calloc realloc,申請的動態記憶體分為多少份此函式無法明確,所以應在malloc calloc realloc前面加上型別 1.malloc malloc函式的形參為所要申請的動態記憶體位元組數 動態...