C++newのいくつかの失敗状況と処理について
2972 ワード
Copyright @Copy+Joel at 2017.07.23 08:00 a.m in Shenzhen.China. LIST- TE- E11 -03
malloc/callocなどのメモリを割り当てる関数を使用する場合、必ず戻り値が「空のポインタ」であるかどうかをチェックします(つまり、メモリの割り当て操作が成功したかどうかをチェックします).これは良いプログラミング習慣であり、信頼できるプログラムを書くために必要です.しかし、簡単にnewに適用すれば、必ずしも正しいとは限りません.このようなコードはよく見られます.
try{int*p=new int[SIZE];//その他コード}catch(const bad_alloc&e){return-1;}
int* p = new (std::nothrow) int;//これでnewが失敗したら異常を投げ出すのではなく、空のポインタif(p==0)/を返すという判断に意味があるreturn-1;
double *ptr=new double[1000000]; if(0==ptr)......処理に失敗しました......
try { double *ptr=new double[1000000]; } catch(bad_alloc&memExp){//失敗後、abortかcerr<}の再割り当て
typedef void (*new_handler)(); new_handler set_new_handler(new_handler p) throw();
//function to call if operator new can't allocate enough memory void nomorememory() { cerr << "unable to satisfy request for memory"; abort(); } int main(){ set_new_handler(nomorememory); int *pbigdataarray = new int[100000000]; ... }
malloc/callocなどのメモリを割り当てる関数を使用する場合、必ず戻り値が「空のポインタ」であるかどうかをチェックします(つまり、メモリの割り当て操作が成功したかどうかをチェックします).これは良いプログラミング習慣であり、信頼できるプログラムを書くために必要です.しかし、簡単にnewに適用すれば、必ずしも正しいとは限りません.このようなコードはよく見られます.
int* p = new int[SIZE]; if ( p == 0 )```
// p return -1; // ....
, if ( p == 0 ) 。C++ , new , ** ** 。 , ,p == 0 ; , if ( p == 0 ), ,new ** **。 new , ** **:
try{int*p=new int[SIZE];//その他コード}catch(const bad_alloc&e){return-1;}
,new , ( C++ ), malloc , 。 new . , C++ ** new **, :
int* p = new (std::nothrow) int;//これでnewが失敗したら異常を投げ出すのではなく、空のポインタif(p==0)/を返すという判断に意味があるreturn-1;
:
c++ ,new bad_alloc , c++ , vc++6.0 new , 0.
// c++
double *ptr=new double[1000000]; if(0==ptr)......処理に失敗しました......
// :
try { double *ptr=new double[1000000]; } catch(bad_alloc&memExp){//失敗後、abortかcerr<}の再割り当て
// :
set_new_handler new 。 :
typedef void (*new_handler)(); new_handler set_new_handler(new_handler p) throw();
,new_handler , 。set_new_handler new_handler 。
set_new_handler operator new , set_new_handler 。
set_new_handler:
//function to call if operator new can't allocate enough memory void nomorememory() { cerr << "unable to satisfy request for memory"; abort(); } int main(){ set_new_handler(nomorememory); int *pbigdataarray = new int[100000000]; ... }
operator new ,new-handler , , 。 8 , : new-handler 。
* 。 operator new 。 : , new-handler 。 , , , 。
* new-handler 。 new-handler , new-handler 。 , new-handler new-handler ( set_new_handler)。 operator new new-handler , 。( new-handler , , 。 new-handler 。)
* new-handler。 set_new_handler。 new-handler,operator new std::bad_alloc 。
* std::bad_alloc std::bad_alloc 。 operator new , 。( operator new 。 abort, new-handler , std::bad_alloc 。 )
* 。 abort exit。abort/exit c ( c++ )。
***
The sharing of knowledge, the spirit of encouragement.
By Joel Jiang ( )