<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 134,comments - 22,trackbacks - 0

    1,當(dāng)operator new無法滿足內(nèi)存需求時,拋出std::bad_alloc.
    下面是一個驗(yàn)證的代碼:

    Cpp代碼 復(fù)制代碼
    1. #include <iostream>   
    2. #include <stdexcept>   
    3. using namespace std ;   
    4.   
    5. int main ()   
    6. {   
    7.     try  
    8.     {   
    9.         int* p=NULL;   
    10.         while(1)   
    11.             p=new int[10000];   
    12.     }catch(std::bad_alloc&)   
    13.     {   
    14.         cout<<"no enough mem."<<endl;   
    15.     }   
    16.     return 0 ;   
    17. }  



    2,C++的一個公約:
    當(dāng)operator new無法滿足需求時,它會在拋出exception前先調(diào)用一個專屬的錯誤處理函數(shù).
    我們稱之為:new-handler.

    3,當(dāng)operator無法滿足內(nèi)存需求時,它會不只一次的調(diào)用new-handler函數(shù);
    它會不斷的重復(fù)調(diào)用,直到找到足夠的內(nèi)存.
    一個設(shè)計良好的new-handler函數(shù)必須完成下面幾件事:
    (1)讓更多內(nèi)存可用.
    例如:事先在程序起始處配置一大塊內(nèi)存,然后在new-handler第一次被調(diào)用時釋放之.
    (2)配置另外一個new-handler,其手上握有比較多的資源.
    (3)卸除new-handler,set_new_handler(NULL)
    將不再調(diào)用專屬函數(shù),而直接拋出exception.
    (4)拋出exception.
    (5)不回返,直接調(diào)用abort()或exit.

    Cpp代碼 復(fù)制代碼
    1. #include <iostream>   
    2. #include <stdexcept>   
    3. using namespace std ;   
    4.   
    5. void noMoreMemory()   
    6. {   
    7.     cout<<"Unable to satify request for memory."<<endl;   
    8.     //原則(5):不回返   
    9.     abort();//不加,將會是一個死循環(huán).   
    10.     //原則(4):也可以通過拋出一個異常   
    11.     //throw std::bad_alloc();   
    12. }   
    13.   
    14. int main ()   
    15. {   
    16.     //typedef void (*new_handler)();  頭文件中已經(jīng)給出   
    17.     //設(shè)定自己的專屬錯誤處理函數(shù).   
    18.     //返回之前的new_handler   
    19.     new_handler old_new_handler=set_new_handler(noMoreMemory);   
    20.     //set_new_handler(NULL); //卸除new-handler,拋出異常.   
    21.     try  
    22.     {   
    23.         int* p=NULL;   
    24.         while(1)   
    25.             p=new int[10000];   
    26.     }catch(std::bad_alloc&)   
    27.     {   
    28.         cout<<"no more memory."<<endl;   
    29.         set_new_handler(old_new_handler);   
    30.     }   
    31.     set_new_handler(old_new_handler);   
    32.     return 0 ;   
    33. }  


    4,設(shè)定類class專屬的new-handler.
    一個強(qiáng)大的類模板.

    Cpp代碼 復(fù)制代碼
    1. #include <iostream>   
    2. #include <stdexcept>   
    3. using namespace std ;   
    4.   
    5. template<class T>   
    6. class NewHandlerSupport   
    7. {   
    8. public:   
    9.     static new_handler set_new_handler(new_handler p);   
    10.     static void* operator new(size_t size);   
    11.     static void* operator new[](size_t size);   
    12. private:   
    13.     static new_handler currentHandler;   
    14. };   
    15.   
    16. template<class T>   
    17. new_handler NewHandlerSupport<T>::set_new_handler(new_handler p)   
    18. {   
    19.     new_handler oldHandler=currentHandler;   
    20.     currentHandler=p;   
    21.     return oldHandler; //返回之前的專屬函數(shù)   
    22. }   
    23.   
    24. template<class T>   
    25. void* NewHandlerSupport<T>::operator new(size_t size)   
    26. {   
    27.     //下面調(diào)用標(biāo)準(zhǔn)的set_new_handler   
    28.     new_handler globalHandler=std::set_new_handler(currentHandler);   
    29.   
    30.     void* memory;   
    31.     try  
    32.     {   
    33.         //使用標(biāo)準(zhǔn)的new.   
    34.         memory=::operator new(size);   
    35.     }catch(std::bad_alloc)   
    36.     {   
    37.         std::set_new_handler(globalHandler);   
    38.         throw//繼續(xù)拋出異常   
    39.     }   
    40.   
    41.   
    42.     std::set_new_handler(globalHandler); //返回原來的設(shè)置   
    43.     return memory; //返回之前的專屬函數(shù)   
    44. }   
    45.   
    46. template<class T>   
    47. static void* NewHandlerSupport<T>::operator new[](size_t size)   
    48. {   
    49.     return operator new(size);   
    50. }   
    51.   
    52. template<class T>   
    53. new_handler NewHandlerSupport<T>::currentHandler; //設(shè)置為0   
    54.   
    55. void noMoreMemory()   
    56. {   
    57.     cout<<"Unable to satify request for memory."<<endl;   
    58.     //abort();   
    59.     throw std::bad_alloc();   
    60. }   
    61.   
    62. class X : public NewHandlerSupport<X>   
    63. {   
    64. };   
    65.   
    66. int main ()   
    67. {   
    68.     X::set_new_handler(noMoreMemory);   
    69.     try  
    70.     {   
    71.         X* p=NULL;   
    72.         //先調(diào)用專屬函數(shù),然后有專屬函數(shù)拋出異常.   
    73.         while(1)   
    74.             p=new X[100000];   
    75.     }catch(std::bad_alloc&)   
    76.     {   
    77.         cout<<"no more memory."<<endl;   
    78.     }   
    79.   
    80.     X::set_new_handler(0);   
    81.     try  
    82.     {   
    83.         X* p=NULL;   
    84.         //不再調(diào)用專屬函數(shù),直接捕獲異常.   
    85.         while(1)   
    86.             p=new X[100000];   
    87.     }catch(std::bad_alloc&)   
    88.     {   
    89.         cout<<"no more memory."<<endl;   
    90.     }   
    91.     return 0 ;   
    92. }  


    5,舊的編譯器:
    如果內(nèi)存配置失敗不會拋出異常,只是返回0.
    測試實(shí)例:
    int* p=new (nothrow)int;
    if(p==0)
    cout<<"memory error;"<<endl;

    posted on 2010-05-13 14:37 何克勤 閱讀(335) 評論(0)  編輯  收藏 所屬分類: C/C++
    主站蜘蛛池模板: 亚洲精品国产成人中文| 亚洲精品色播一区二区| 在线观看免费人成视频色| 亚洲av永久中文无码精品综合| 免费大香伊蕉在人线国产| 免费看男人j放进女人j免费看| 亚洲日日做天天做日日谢| 国产综合亚洲专区在线| 日本片免费观看一区二区| 午夜不卡AV免费| 亚洲国产成人久久精品app| 亚洲精品成人在线| 动漫黄网站免费永久在线观看| 一级一级毛片免费播放| 亚洲宅男精品一区在线观看| 亚洲伊人久久大香线蕉综合图片| 免费看黄视频网站| 中文字幕成人免费高清在线视频 | 久久av免费天堂小草播放| 亚洲国产一区在线观看| 免费欧洲美女牲交视频| 国产成人精品免费午夜app| 一个人看的在线免费视频| 亚洲综合中文字幕无线码| 亚洲人成影院在线无码按摩店| 成年午夜视频免费观看视频| 免费视频成人手机在线观看网址| 久久亚洲中文字幕无码| 99久久精品国产亚洲| 在线观看国产区亚洲一区成人| 成年女人毛片免费视频| 91短视频在线免费观看| 一级一级毛片免费播放| 爱情岛亚洲论坛在线观看| 亚洲一区二区三区无码国产| 亚洲国产精品久久久天堂| 国产成人麻豆亚洲综合无码精品 | 亚洲精品在线视频| 卡1卡2卡3卡4卡5免费视频| 精品免费人成视频app| 日本免费电影一区二区|