欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

一、函數(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ù)的作用是:當(dāng)new操作或new[]操作失敗時(shí)調(diào)用參數(shù)所指的new_p函數(shù)

異常安全:

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

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

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

函數(shù)說明

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

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

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

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

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

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

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

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

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

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

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

五、演示案例

下面程序中new操作分配內(nèi)存失敗時(shí)將調(diào)用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;
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++實(shí)現(xiàn)批量圖片拼接

    C++實(shí)現(xiàn)批量圖片拼接

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)批量圖片拼接,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C++實(shí)現(xiàn)簡易萬年歷

    C++實(shí)現(xiàn)簡易萬年歷

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡易萬年歷,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • C/C++檢測文件是否存在的常見方法

    C/C++檢測文件是否存在的常見方法

    在C和C++中,檢測文件是否存在的方法通常涉及到平臺特定的API或者使用標(biāo)準(zhǔn)庫的功能(在C++17及以后版本中),本文給大家介紹了C/C++檢測文件是否存在的幾種常見方法,感興趣的小伙伴跟著小編一起來看看吧
    2024-06-06
  • Qt中QSettings配置文件的讀寫和應(yīng)用場景詳解

    Qt中QSettings配置文件的讀寫和應(yīng)用場景詳解

    這篇文章主要給大家介紹了關(guān)于Qt中QSettings配置文件的讀寫和應(yīng)用場景的相關(guān)資料,QSettings能讀寫配置文件,當(dāng)配置文件不存在時(shí),可生成配置文件,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • VS?Code+msys2配置Windows系統(tǒng)下C/C++開發(fā)環(huán)境

    VS?Code+msys2配置Windows系統(tǒng)下C/C++開發(fā)環(huán)境

    我們在windows10中使用VS Code做C++程序開發(fā)過程中,需要安裝MSYS2和MinGW,下面這篇文章主要給大家介紹了關(guān)于VS?Code+msys2配置Windows系統(tǒng)下C/C++開發(fā)環(huán)境的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • C語言實(shí)現(xiàn)俄羅斯方塊源代碼

    C語言實(shí)現(xiàn)俄羅斯方塊源代碼

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)俄羅斯方塊的源代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • C++實(shí)現(xiàn)LeetCode(56.合并區(qū)間)

    C++實(shí)現(xiàn)LeetCode(56.合并區(qū)間)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(56.合并區(qū)間),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言冒泡排序法心得

    C語言冒泡排序法心得

    相信學(xué)過C語言的朋友都知道,在C語言中,常用的排序算法有:冒泡排序、快速排序、插入排序、選擇排序、希爾排序、堆排序以及歸并排序等等。就算沒有用過,相信大家也有所耳聞。在這里呢,主要是想和大家一起來探討探討C語言的冒泡排序法,
    2016-01-01
  • C++瓦片地圖坐標(biāo)轉(zhuǎn)換的實(shí)現(xiàn)詳解

    C++瓦片地圖坐標(biāo)轉(zhuǎn)換的實(shí)現(xiàn)詳解

    常見的瓦片地圖有矩形、菱形、正六邊形幾種。此文章主要討論菱形瓦片,也就是大家常說的2.5D,斜45度瓦片地圖。比如《紅警2》、《帝國時(shí)代2》都是采用這種技術(shù)
    2022-09-09
  • C語言對結(jié)構(gòu)體數(shù)組按照某項(xiàng)規(guī)則進(jìn)行排序的實(shí)現(xiàn)過程探究

    C語言對結(jié)構(gòu)體數(shù)組按照某項(xiàng)規(guī)則進(jìn)行排序的實(shí)現(xiàn)過程探究

    這篇文章主要介紹了C語言對結(jié)構(gòu)體數(shù)組按照某項(xiàng)規(guī)則進(jìn)行排序的實(shí)現(xiàn)過程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-02-02

最新評論