C++newのいくつかの失敗状況と処理について

2972 ワード

Copyright @Copy+Joel at 2017.07.23 08:00 a.m in Shenzhen.China. LIST- TE- E11 -03
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 (   )