網頁

2022/7/27

C++ new及delete用法

C++的關鍵字newdelete用法如下。


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)很相似,但有以下差異:

  1. 陣列的元素長度必須是常數,編譯前就要決定;而new配置的空間長度是在執行期間(runtime)決定,不必為常數,所以稱為動態記憶體(dynamic memory)。
  2. 函式中宣告的陣列在記憶體的stack;new則在記憶體的heap。



3 則留言:

  1. 哇! 肉豬大怎麼會開始想學C++呢

    回覆刪除
  2. 因為在看資料結構那本書範例是C++,然後學了一下覺得蠻有趣的,所以就順勢開始學了。

    回覆刪除