C++的關鍵字new
及delete
用法如下。
new
new
用來動態配置一塊heap記憶體空間,宣告時指定資料型態並返回記憶體位址,語法如下。pointer
為指標;type
為資料型態。
pointer = new type
例如下面配置1個儲存整數型態的heap記憶體位址給指標p
。
int *p = new int;
new
也可配置多個連續的heap記憶體空間,在資料型態後以方括弧[]
設定儲存資料的長度(數量)。length
為儲存資料的長度。
pointer = new type[length]
例如下面配置5個儲存整數的heap連續記憶體位址給指標p
。
int *p = new int[5];
當配置連續多個記憶體空間時,指標所指的位址為連續記憶體空間的第一個位址。
heap memory space
┌───┬───┬───┬───┬───┐
│ 0 │ 0 │ 0 │ 0 │ 0 │
└───┴───┴───┴───┴───┘
│
0x7f88aec05a40
▲
│
p
delete
delete
用來釋放new
的記憶體空間,語法如下。pointer
為指向new
的記體體位址的指標。
delete pointer
例如下面釋放指標p
指向的new
的記憶體空間。
int *p = new int;
delete p;
delete[]
用來釋放由new
的連續多個記憶體空間
,語法如下。pointer
為指向new
的記體體位址的指標。
delete[] pointer
例如下面釋放指標p
指向的new
的連續多個記憶體空間。
int *p = new int[5];
delete[] p;
範例
下面new
配置連續多個heap記憶體空間並返回位址給pointer p
,接著分派1到第一個空間,分派2到第二個空間,最後delete
釋放p
指向的記憶體空間。
main.cpp
#include <iostream>
using namespace std;
int main() {
int *p = new int[5];
*p = 1;
cout << p << endl; // 0x7ffb77c05a40
cout << *p << endl; // 1
cout << p[0] << endl; // 1
p[1] = 2;
cout << p[1] << endl; // 2
delete[] p;
return 0;
}
new
配置記憶體時可設定初值。
main.cpp
#include <iostream>
using namespace std;
int main() {
int *p = new int[3]{1, 2, 3};
cout << p[0] << endl; // 1
cout << p[1] << endl; // 2
cout << p[2] << endl; // 3
delete[] p;
return 0;
}
new
與陣列的差別
new
與陣列(array)很相似,但有以下差異:
- 陣列的元素長度必須是常數,編譯前就要決定;而
new
配置的空間長度是在執行期間(runtime)決定,不必為常數,所以稱為動態記憶體(dynamic memory)。 - 函式中宣告的陣列在記憶體的stack;
new
則在記憶體的heap。
哇! 肉豬大怎麼會開始想學C++呢
回覆刪除因為在看資料結構那本書範例是C++,然後學了一下覺得蠻有趣的,所以就順勢開始學了。
回覆刪除原來是這樣~
回覆刪除