C++動態分配記憶體(new)和撤銷記憶體(delete)
在軟體開發過程中,常常需要動態地分配和撤銷記憶體空間,例如對動態連結串列中結點的插入與刪除。
在C語言中是利用庫函式malloc和free來分配和撤銷記憶體空間的。
C++提供了較簡便而功能較強的運算子new和delete來取代malloc和free函式。
注意: new和delete是運算子,不是函式,因此執行效率高。
雖然為了與C語言相容,C++仍保留malloc和free函式,但建議使用者不用malloc和free函式,而用new和delete運算子。new運算子的例子:
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 型別 [初值];
【例7】開闢空間以存放一個結構體變數。
#include <iostream>
#include <string>
using namespace std;
struct Student //宣告結構體型別Student
{
string name;
int num;
char sex;
};
int main( )
{
Student *p; //定義指向結構體型別Student的資料的指標變數
p=new Student; //用new運算子開闢一個存放Student型資料的空間
p->name="Wang Fun"; //向結構體變數的成員賦值
p->num=10123;
p->sex='m';
cout<<p->name<<endl<<p->num
<<endl<<p->sex<<endl; //輸出各成員的值
delete p; //撤銷該空間
return 0;
}
執行結果為:Wang Fun 10123 m
圖7.11 為new student開闢的空間
。
用new分配陣列空間時不能指定初值。如果由於記憶體不足等原因而無法正常分配空間,則new會返回一個空指標NULL,使用者可以根據該指標的值判斷分配空間是否成功。
delete運算子使用的一般格式為:
delete [ ] 指標變數
例如要撤銷上面用new開闢的存放單精度數的空間(上面第5個例子),應該用
delete p;
前面用“new char[10];”開闢的字元陣列空間,如果把new返回的指標賦給了指標變數pt,則應該用以下形式的delete運算子撤銷該空間:
delete [] pt; //在指標變數前面加一對方括號,表示是對陣列空間的操作
在動態分配/撤銷空間時,往往將這兩個運算子和結構體結合使用,是很有效的。可以看到:要訪問用new所開闢的結構體空間,無法直接通過變數名進行,只能通過指標p進行訪問。如果要建立一個動態連結串列,必須從第一個結點開始,逐個地開闢結點並輸入各結點資料,通過指標建立起前後相鏈的關係。
NdkDemo程式碼已上傳至Github