ホームに戻る
 new と delete

#include <iostream>

/*
*
*   new と delete
*
*   new を使用するとヒープに領域を確保します。
*   try 内での new の失敗は bad_alloc を throw するので、
*   この場合 catch 内で適切な処置が必要です。
*   他に new に失敗すると 0 を返す場合もあり、
*   使用するコンパイラごとに失敗を検出できる方法を
*   調査する必要がありそうです。
*
*   たとえば古いバーションのVC++では、
*   下のような記述をしないとエラーを throw しません。
*
*   #include <new.h> 
*
*   int ThrowBadAlloc(size_t){
*     throw std::bad_alloc();
*     return(0);
*   }
*
*   int main{
*     _set_new_handler(ThrowBadAlloc); // 関数を定義
*
*   delete はメモリの解放を行います。
*   非配列と配列の解放のやり方が異なります。
*
*   delete p;     // 非配列
*   delete [] p;  // 配列
*
*   たとえば配列を非配列の解放で行うと、
*   予測できないエラーが起こる危険性があります。
*
*   delete は領域がまだ確保されていないポインタや
*   いちど delete で解放されたポインタに対して行うと、
*   予測できないエラーを起こします。
*   delete は必ず new が成功したポインタに対して行うようにします。
*   ただし、ポインタが NULL である場合は、
*   delete をしても問題が無いことが保障されています。
*   new で使う予定のポインタは NULL で初期化するようにし、
*   delete した後も NULL を入れておくと安全かもしれません。
*
*/

int main( ) 
{
  int i = 0, t;
  int *p[64];

  try{
    while(1){
      if(i == 64)break;
      p[i] = new int[50000000];
      std::cout << i << ":Allocating 50000000 ints." << std::endl;
      i++;
    }
  }
  catch(std::bad_alloc e){
    std::cout << i << ":"<< e.what( ) << std::endl;
    p[i] = NULL;  // 念のため
  }

  for(t = 0; t < i; t++){
    delete [] p[t];
    p[t] = NULL;
  }

  return 0;
}

 結果

0:Allocating 50000000 ints.
1:Allocating 50000000 ints.
         ・
         ・
         ・
n:bad alloc exception thrown

inserted by FC2 system