概述
在軟件開發過程中,常常需要動態地分配和撤銷存儲空間,例如對動態鏈表中結點的插入與刪除。在C語言中是利用庫函數malloc和free來分配和撤銷內存空間的。C++提供了較簡便而功能較強的運算符new和delete來取代malloc和free函數。
注意: new和delete是運算符,不是函數,因此執行效率高。
雖然為了與C語言兼容,C++仍保留malloc和free函數,但建議用戶不用malloc和free函數,而用new和delete運算符。
new int; //開辟一個存放整數的存儲空間,返回一個指向該存儲空間的地址(即指針)
new int(100); //開辟一個存放整數的空間,並指定該整數的初值為100,返回一個指向該存儲空間的地址
new char[10]; //開辟一個存放字符數組(包括10個元素)的空間,返回首元素的地址
new int[5][4]; //開辟一個存放二維整型數組(大小為5*4)的空間,返回首元素的地址
float *p=new float (3.14159); //開辟一個存放單精度數的空間,並指定該實數的初值為//3.14159,將返回的該空間的地址賦給指針變量p
用new分配數組空間時不能指定初值。如果由於內存不足等原因而無法正常分配空間,則new會返回一個空指針NULL,用戶可以根據該指針的值判斷分配空間是否成功。
malloc與new分配基本數據類型空間
// C語言 malloc與free
int *p = (int *)malloc(sizeof(int));
*p = 10;
free(p); // 釋放分配的空間
// C++語言 new 與 delete
int *p2 = new int;
*p2 = 20;
int *p3 = new int(5);
printf("p3=%d", *p3);
delete p2; // 釋放分配的空間
delete p3; // 釋放分配的空間
malloc與new分配數組數據類型空間
// 分配數組
void test2(){
// C語言分配數組
int *p = (int *)malloc(sizeof(int)*10);
p[0] = 1;
free(p);
// C++語言分配數組
int *pp = new int[10];
pp[0] = 1;
delete [] pp; // 釋放數組需要添加[]
}
malloc與new分配類類型空間
// 分配對象
void test3(){
// C語言的malloc
Circle *c = (Circle *)malloc(sizeof(Circle));
c->m_r = 10.0;
double s = c->getS();
free(c);
// C++語言 new
Circle *c2 = new Circle();
Circle *c3 = new Circle(10.0); // 有參構造函數
c3->m_r = 10.0;
double s3 = c3->getS();
delete c2;
delete c3;
}
在執行new運算時,如果內存量不足,無法開辟所需的內存空間,目前大多數C++編譯系統都使new返回一個0指針值。只要檢測返回值是否為0,就可判斷分配內存是否成功。
new 會調用類的構造函數 delete能調用類的析構函數,C語言的malloc與free函數則相反。