HOME > natural science Laboratory > コンピュータ・シミュレーション講座 > TIPS 集

C++ メモリの動的確保(new)

文責:遠藤 理平 (2009年9月11日) カテゴリ:TIPS 集(102)

数値計算時に巨大な配列を組む必要がある。通常の変数や配列宣言でメモリを確保するスタック領域では、巨大配列を記憶するメモリが足らない場合がよくある。そんなときに利用するのが、スタック領域に比べて巨大なヒープ領域での動的なメモリ確保。

C++ソース

/* NEW演算子の使い方 */
#include <iostream>
using namespace std;
int main()
{
  //変数---------------------------------------------------------------
  cout << "変数" <<endl;
  int *p1;
  p1 = new int();  // int型の領域を動的確保
  *p1 = 123;
  cout << *p1 << endl;
  delete p1;       // 動的に確保した領域を解放

  //1次元配列----------------------------------------------------------
  cout << "1次元配列(2-1)" <<endl;
  int *p2;
  p2 = new int[10];  // int型10個分の領域を動的確保
  for(int i=0; i<10; ++i)
  {
    p2[i] = i;
    cout << p2[i] << " ";
  }
  cout <<endl;
  delete [] p2;       // 動的に確保した領域を解放

  //2次元配列(1)--------------------------------------------------------
  cout << "2次元配列(1)" <<endl;
  int (*p3)[10] = new int[5][10];  // int型5×10個分の領域を動的確保

  for(int i=0; i<5; ++i){
    for(int j=0; j<10; ++j){
      p3[i][j] = (i+1)*(j+1);
      cout << p3[i][j] << " ";
    }
    cout <<endl;
  }
  delete [] p3;       // 動的に確保した領域を解放

  //2次元配列(2)--------------------------------------------------------------
  cout << "2次元配列(2)" <<endl;
  int **p4= new int*[5];  // int型5個分の領域を動的確保
  for (int i= 0; i<5; ++i) p4[i]= new int[10];  // int型10個分の領域をそれぞれ動的確保

  for(int i=0; i<5; ++i){
    for(int j=0; j<10; ++j){
      p4[i][j] = (i+1)*(j+1);
      cout << p4[i][j] << " ";
    }
    cout <<endl;
  }
  for (int i= 0; i<5; ++i) delete[] p4[i]; // 動的に確保した領域をそれぞれ解放
  delete[] p4;

  //3次元配列(1)--------------------------------------------------------
  cout << "3次元配列(1)" <<endl;
  int ***p5 ;  // 
  p5 = new int**[5];
  for (int i= 0; i<5 ; ++i){
    p5[i] = new int*[2];
    for (int j= 0; j<2 ; ++j){
      p5[i][j] = new int[10];
    }
  }
  for(int i=0; i<5; ++i){
    for(int j=0; j<2; ++j){
      for(int k=0; k<10; ++k){
        p5[i][j][k] = (i+1)*(j+1)*(k+1);
        cout << p5[i][j][k] << " ";
      }
      cout <<endl;
    }
  }

  for(int i=0; i<5; ++i){
    for(int j=0; j<2; ++j){
      delete[] p5[i][j];
    }
    delete[] p5[i];
  }
  delete[] p5;      // 動的に確保した領域を解放
  return 0;
}

実行結果

20090911.gif



タグ:

▲このページのトップNPO法人 natural science トップ

▲このページのトップNPO法人 natural science トップ