最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ 內存分配處理函數(shù)set_new_handler的使用

 更新時間:2020年02月23日 14:50:54   作者:江南、董少  
這篇文章主要介紹了C++ 內存分配處理函數(shù)set_new_handler的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

一、函數(shù)的定義

函數(shù)在namespace std中有如下定義(C++98與C++11版本不一致):

Typedef void (*new_handler)();
 
new_handler set_new_handler(new_handler new_p) throw();  //C++98
new_handler set_new_handler (new_handler new_p) noexcept; //C++11

二、函數(shù)介紹

該函數(shù)的作用是:當new操作或new[]操作失敗時調用參數(shù)所指的new_p函數(shù)

異常安全:

  • C++98、C++11分別在函數(shù)后面使用了throw()、noexcept聲明,所以該函數(shù)(set_new_handler)不會拋出異常
  • 注意:如果new_p是沒有實現(xiàn)適當功能的函數(shù)指針(見下面的參數(shù)說明),或者如果new_p是無效的指針,它會導致未定義的行為

數(shù)據(jù)爭用:

  • 調用此函數(shù)不會引入數(shù)據(jù)競爭,任何這樣的調用將會和隨后set_new_handler和set_new_handler的調用同步
  • 注意,此要求僅適用于set_new_handler函數(shù),但對于作為參數(shù)(new_p)傳遞的新處理函數(shù)卻非必須

函數(shù)說明

1.   set_new_handler函數(shù)的作用是設置new_p指向的函數(shù)為new操作或new[]操作失敗時調用的處理函數(shù)。

2.   設置的處理函數(shù)可以嘗試使更多空間變?yōu)榭煞峙錉顟B(tài),這樣新一次的new操作就可能成功。當且僅當該函數(shù)成功獲得更多可用空間它才會返回;否則它將拋出bad_alloc異常(或者繼承該異常的子類)或者終止程序(例如調用abort或exit)。

3.   如果設置的處理函數(shù)返回了(例如,該函數(shù)成功獲得了更多的可用空間),它可能將被反復調用,直到內存分配成功,或者它不再返回,或者被其它函數(shù)所替代。

4.   在尚未用set_new_handler設置處理函數(shù),或者設置的處理函數(shù)為空時,將調用默認的處理函數(shù),該函數(shù)在內存分配失敗時拋出bad_alloc異常。

三、函數(shù)的參數(shù)
new_p:

  • 當new操作或new[]操作失敗時調用的函數(shù)
  • 該函數(shù)參數(shù)列表為空,且返回值類型為void
  • 該函數(shù)可以嘗試獲得更多的可用空間,或者拋出異常,或者終止程序
  • 如果是一個空指針或0,處理函數(shù)將被重置為默認值(將會執(zhí)行拋出bad_alloc異常)

設置的處理函數(shù)可以嘗試使更多空間變?yōu)榭煞峙錉顟B(tài),這樣新一次的new操作就可能成功。當且僅當該函數(shù)成功獲得更多可用空間它才會返回;否則它將拋出bad_alloc異常(或者繼承該異常的子類)或者終止程序(例如調用abort或exit)

如果設置的處理函數(shù)返回了(例如,該函數(shù)成功獲得了更多的可用空間),它可能將被反復調用,直到內存分配成功,或者它不再返回,或者被其它函數(shù)所替代

如果未設置處理函數(shù),或者設置的處理函數(shù)為空時,將調用默認的處理函數(shù),該函數(shù)在內存分配失敗時拋出bad_alloc異常

四、函數(shù)的返回值

  • 返回先前被設置的處理函數(shù)指針
  • 如果set_new_handler參數(shù)為空或者已被重置,將返回空指針
  • 返回的函數(shù)指針是無參數(shù)的且返回值為void類型的

五、演示案例

下面程序中new操作分配內存失敗時將調用no_memory函數(shù)

// new_handler example
#include <iostream>   // std::cout
#include <cstdlib>   // std::exit
#include <new>     // std::set_new_handler
 
void no_memory () {
 std::cout << "Failed to allocate memory!\n";
 std::exit (1);
}
 
int main () {
  //綁定no_memory處理函數(shù)
  std::set_new_handler(no_memory);
  
  std::cout << "Attempting to allocate 1 GiB...";
  char* p = new char [1024*1024*1024];
  std::cout << "Ok\n";
  
  delete[] p;
  return 0;
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

最新評論

浮梁县| 黑河市| 莱州市| 平凉市| 通渭县| 客服| 邓州市| 东丽区| 正安县| 桃园县| 牡丹江市| 黄大仙区| 镇远县| 定安县| 太仆寺旗| 柳江县| 鄱阳县| 武夷山市| 曲水县| 巩留县| 茌平县| 上犹县| 滨海县| 申扎县| 金山区| 阳城县| 车致| 志丹县| 图木舒克市| 松潘县| 韶关市| 大兴区| 山丹县| 磐石市| 来凤县| 宁安市| 策勒县| 琼海市| 桦川县| 常宁市| 大同县|