第 12 章: new / delete

new と delete

C 言語:

1. malloc
2. free

C++ 言語:

1. new (メモリ動的確保)
2. delete (メモリ開放)

new と delete を使う

new_del.cpp

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#include <iostream>

int main(){
  int *p;

  p = new int(); // int 型の領域を動的確保
  *p = 123;


  std::cout << *p << std::endl;

  delete p; // 動的に確保した領域を解放
  
  return 0;
}

上記プログラムの実行結果は:

[wtopia cpp.lang]$ ./new_del
123

C++ では変数を初期化するときに, 下記の方法がある:

int num = 100;
int num(100);
p = new int(100);

注意 1:

C++ では [代入] と [初期化] は異なる. コンストラクタが呼び出されるのは [初期化]

注意 2:

new 演算子はコンストラクタを呼び出す
delete 演算子は デストラクタを呼び出す

配列を使う

次に new 演算子を使って, 配列用の領域を確保してみる.

array.cpp

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>

int main(){

  using namespace std;

  int *p;
  int i;

  p = new int[10]; // int 型 10 個分の領域を動的確保

  for(i = 0; i < 10; i++){
    p[i] = i;
    cout << p[i] << endl;
  }

  delete [] p; // 動的に確保した領域を解放

  return 0;
}

上記プログラムの実行結果は:

[wtopia cpp.lang]$ ./array
0
1
2
3
4
5
6
7
8
9

new でインスタンス化

new 演算子を使って, クラスをインスタンス化できる:

#include <iostream>

int main(){
  CSample *p;
  p = new CSample(100);

  cout << p->Get() << endl;
  delete p;

  return 0;
}

malloc 関数を使わない理由