ホームに戻る
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