free和delete
只是把指針?biāo)傅膬?nèi)存給釋放掉,但并沒有把指針本身干掉。
注意:
(1)指針消亡了,并不表示它所指的內(nèi)存會(huì)被自動(dòng)釋放。
(2)內(nèi)存被釋放了,并不表示指針會(huì)消亡或者成了NULL指針。
比較
malloc和free:無法滿足動(dòng)態(tài)對(duì)象的要求。對(duì)象在創(chuàng)建同時(shí)進(jìn)行構(gòu)造,消亡同時(shí)析構(gòu)。
malloc free是庫函數(shù),不是運(yùn)算符,不受編譯器控制。
new和delete:不是庫函數(shù),能動(dòng)態(tài)內(nèi)存分配和清理內(nèi)存。
內(nèi)存耗盡
內(nèi)存耗盡時(shí)new和malloc返回NULL。但在WIN32下,使用虛擬內(nèi)存,不會(huì)耗盡的。
處理內(nèi)存耗盡大概有兩種。
A *a = new A;
1 一處內(nèi)存申請
if(a == NULL)
{
return;
}
2 如果有多處申請內(nèi)存,則
if(a == NULL)
{
cout << “Memory Exhausted” << endl;
exit(1);
}
new與delete使用要點(diǎn)
1 new內(nèi)置了sizeof、類型轉(zhuǎn)換和類型安全檢查功能。
2 new在創(chuàng)建非內(nèi)部數(shù)據(jù)類型的動(dòng)態(tài)對(duì)象的同時(shí)完成了初始化工作。
3 對(duì)象有多個(gè)構(gòu)造函數(shù),那么new的語句也可以有多種形式。
4 如果用new創(chuàng)建對(duì)象數(shù)組,那么只能使用對(duì)象的無參數(shù)構(gòu)造函數(shù)。例如
Obj *objects = new Obj[100]; // 創(chuàng)建100個(gè)動(dòng)態(tài)對(duì)象
不能寫成
Obj *objects = new Obj[100](1);// 創(chuàng)建100個(gè)動(dòng)態(tài)對(duì)象的同時(shí)賦初值1
5在用delete釋放對(duì)象數(shù)組時(shí),留意不要丟了符號(hào)‘[]’。例如
delete []objects; // 正確的用法
delete objects; // 錯(cuò)誤的用法
后者相當(dāng)于delete objects[0],漏掉了另外99個(gè)對(duì)象。