與
C
語言的
malloc
,
calloc
,
realloc
和
free
函數對應,
C++
語言使用
new
和
delete
運算符實作動态記憶體配置設定和釋放。
使用new運算符動态配置設定記憶體
new
運算符配置設定記憶體分為以下兩類情境:一是為變量動态配置設定記憶體,而是為數組動态配置設定記憶體。其中為變量動态配置設定記憶體的一般形式為:
T* p = new T(...);
T
是任意類型名,指派運算符右邊的
T
後可以跟括号,括号内是初始化該變量的值或該類的某一個構造函數的參數清單。程式執行到這裡,在堆中動态配置設定出一塊
sizeof(T)
大小的記憶體空間,
p
中存放着這段記憶體空間的起始位址。為數組動态配置設定記憶體的一般形式為:
T* p = new T[N];
T
是任意類型名,
N
為數組元素的個數,可以是整型表達式。若T是類,則利用
T
的預設構造函數進行初始化。程式執行到這裡,在堆中動态配置設定一塊
N*sizeof(T)
大小的記憶體空間,
p
中存放着這段記憶體空間的位址。
用 delete
運算符釋放動态配置設定的記憶體
delete
用
new
運算符配置設定的記憶體空間不會在程式離開其所發揮作用的程式塊時自動釋放記憶體空間,而隻能在程式退出時才能得到釋放。是以必須使用
delete
運算符顯式地釋放動态配置設定的記憶體空間。對于為變量配置設定的記憶體空間,則直接使用
delete p;
進行釋放,而對于為數組配置設定的記憶體空間,則需要使用
delete [] p;
進行釋放。在程式中,要保證使用了一個
new
運算符,就有且僅有一個
delete
運算符與之對應。
小心:除了保證new和delete的成對出現,還要保證兩者的形式相同,若用new ..[]為數組配置設定記憶體空間,必須用delete []釋放該記憶體空間,若用new為變量配置設定記憶體空間,必須用delete釋放該記憶體空間,否則會産生難以預料的結果。使用typedef将數組定義為其他名稱大大增加了出現這種錯誤的可能,是以因避免這種情況。
/*****************************************
* memory_alloc.cpp *
* *
* C++的動态記憶體配置設定 *
*****************************************/
#include <iostream>
using namespace std;
class A
{
private:
int index;
static int id;
public:
A()
{
index = id;
cout<<"構造函數(id = "<<index<<")被調用"<<endl;
id++;
}
~A()
{
cout<<"析構函數(id = "<<index<<")被調用"<<endl;
}
};
int A::id = ;
int main()
{
int *p = new int;
cout<<"*p = "<<*p<<endl;
delete p;
int *p1 = new int();
cout<<"*p1 = "<<*p1<<endl;
delete p1;
A *p2 = new A;
delete p2;
A *p3 = new A[];
delete [] p3;
return ;
}
參考文獻
- https://www.coursera.org/course/pkupop
- Scott Meyers著,侯捷譯. Effective C++中文版. 電子工業出版社. 2012.