<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)存需求時(shí),拋出std::bad_alloc.
    下面是一個(gè)驗(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++的一個(gè)公約:
    當(dāng)operator new無法滿足需求時(shí),它會在拋出exception前先調(diào)用一個(gè)專屬的錯(cuò)誤處理函數(shù).
    我們稱之為:new-handler.

    3,當(dāng)operator無法滿足內(nèi)存需求時(shí),它會不只一次的調(diào)用new-handler函數(shù);
    它會不斷的重復(fù)調(diào)用,直到找到足夠的內(nèi)存.
    一個(gè)設(shè)計(jì)良好的new-handler函數(shù)必須完成下面幾件事:
    (1)讓更多內(nèi)存可用.
    例如:事先在程序起始處配置一大塊內(nèi)存,然后在new-handler第一次被調(diào)用時(shí)釋放之.
    (2)配置另外一個(gè)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();//不加,將會是一個(gè)死循環(huán).   
    10.     //原則(4):也可以通過拋出一個(gè)異常   
    11.     //throw std::bad_alloc();   
    12. }   
    13.   
    14. int main ()   
    15. {   
    16.     //typedef void (*new_handler)();  頭文件中已經(jīng)給出   
    17.     //設(shè)定自己的專屬錯(cuò)誤處理函數(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.
    一個(gè)強(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 何克勤 閱讀(342) 評論(0)  編輯  收藏 所屬分類: C/C++
    主站蜘蛛池模板: 精品一区二区三区无码免费直播| 久久丫精品国产亚洲av| 亚洲欧洲专线一区| 亚洲无码黄色网址| 成人免费网站久久久| 亚洲国产成人a精品不卡在线| 国产亚洲精品免费| 亚洲精品国产V片在线观看| 免费国产在线精品一区 | 中文字幕免费视频精品一| 国产亚洲精品不卡在线| 亚洲第一视频在线观看免费| 一本色道久久综合亚洲精品| 99久久免费国产特黄| 成年人视频在线观看免费| 亚洲性无码一区二区三区| 国产成人免费A在线视频| 日韩精品无码免费视频| 亚洲日韩av无码| 99精品视频在线观看免费专区| 亚洲福利精品电影在线观看| 两个人看的www视频免费完整版| 亚洲人成网77777色在线播放| 久久免费的精品国产V∧| 亚洲AV无码成人专区| 四虎永久免费影院| 最近中文字幕大全免费版在线| 亚洲av无码成人精品区| 在线免费观看伊人三级电影| 亚洲人成网www| 无码毛片一区二区三区视频免费播放| 亚洲国产精品毛片av不卡在线 | 国产在线观看xxxx免费| 亚洲综合久久久久久中文字幕| 两个人看的www免费视频| 亚洲精品成人久久| 亚洲第一黄片大全| 24小时日本电影免费看| 日本亚洲欧美色视频在线播放| 亚洲精品中文字幕乱码三区| 成人无码区免费A片视频WWW |