プログラミング原人の進化ログ

プログラミング原人の進化論

オレ プログラミング ベンキョウ スル。マナンダ コト カク。

C++でメモリを動的に確保する方法

C++でのメモリの動的確保の方法です。Cではmallocとfreeを使うことが多かったのですが、C++ではnewとdeleteを使います。 それらの使い方を書いていきます。

メモリの確保

メモリの確保はnew演算子で行います。newを使うと、ヒープ領域と呼ばれる空きメモリ領域からメモリが確保され、それをデータに割り当てられます。使い方は次の通り。

ポインタ = new

確保しようとする領域のサイズがあまりにも大きくて、ヒープ領域にそれだけの空きがないときには、メモリの確保に失敗します。失敗した場合は、例外を投入するか、ヌルポインタを返します。

メモリの解放

メモリを解放してあげないと、ヒープ領域が全て使われてしまい、それ以上のメモリを確保できない状態になってしまうかもしれません。そこで、newで確保したデータを使い終わったら、それに割り当てられていたメモリ領域をdelteを使って解放します。次のように使います。

delete ポインタ

ポインタは必ずnewで確保したものを指定すること。

具体例

#include<iostream>
using namespace std;

int main() {
  int *p;

  p = new int;  // メモリ確保
  *p = 2;
  cout << *p << endl;

  delete p;  // メモリ解放

  return 0;
}

実行結果:

2

配列を確保したい

配列にメモリを割り当てるには次のようにします。配列のサイズ(要素数)を指定します。

ポインタ = new 型[サイズ]

メモリ解放は次。

delete [] ポインタ 

例えば次のように使います。

#include<iostream>
using namespace std;

int main() {
  int i, *arr;

  arr = new int[5];
  for (i = 0; i < 5; i++) arr[i] = i+1;
  for (i = 0; i < 5; i++) cout << arr[i] << endl;

  delete [] arr;
  
  return 0;
}

実行結果:

1
2
3
4
5

参考

ハーバート・シルト(2009)「標準講座C++」柏原正三訳・監修 株式会社トップスタジオ