C++ 內(nèi)存分配處理函數(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ù)的作用是:當(dāng)new操作或new[]操作失敗時調(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[]操作失敗時調(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ù)為空時,將調(diào)用默認(rèn)的處理函數(shù),該函數(shù)在內(nèi)存分配失敗時拋出bad_alloc異常。
三、函數(shù)的參數(shù)
new_p:
- 當(dāng)new操作或new[]操作失敗時調(diào)用的函數(shù)
- 該函數(shù)參數(shù)列表為空,且返回值類型為void
- 該函數(shù)可以嘗試獲得更多的可用空間,或者拋出異常,或者終止程序
- 如果是一個空指針或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ù)為空時,將調(diào)用默認(rèn)的處理函數(shù),該函數(shù)在內(nèi)存分配失敗時拋出bad_alloc異常
四、函數(shù)的返回值
- 返回先前被設(shè)置的處理函數(shù)指針
- 如果set_new_handler參數(shù)為空或者已被重置,將返回空指針
- 返回的函數(shù)指針是無參數(shù)的且返回值為void類型的
五、演示案例
下面程序中new操作分配內(nèi)存失敗時將調(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)學(xué)籍管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)學(xué)籍管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03
AVX2指令集優(yōu)化浮點(diǎn)數(shù)組求和算法
這篇文章主要為大家介紹了AVX2指令集優(yōu)化浮點(diǎn)數(shù)組求和算法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
C語言修煉之路一朝函數(shù)思習(xí)得?模塊思維世間生上篇
函數(shù)是一組一起執(zhí)行一個任務(wù)的語句。每個?C?程序都至少有一個函數(shù),即主函數(shù)?main()?,所有簡單的程序都可以定義其他額外的函數(shù)2022-03-03
c++中處理相關(guān)數(shù)學(xué)函數(shù)
數(shù)學(xué)庫函數(shù)聲明在 math.h 中,主要有:2013-04-04
詳解C++調(diào)用Python腳本中的函數(shù)的實(shí)例代碼
這篇文章主要介紹了C++調(diào)用Python腳本中的函數(shù) ,需要的朋友可以參考下2018-11-11

