set_new_handler(0)有什么用
出自《STL源碼剖析》第45頁中有一行代碼set_new_handler(0);
源代碼
inline T* _allocate(ptrdiff_t size, T*) { std::set_new_handler(0); T* tmp = (T*)(::operator new((size_t)(size * sizeof(T)))); if (tmp == 0) { std::cerr << "out of menory" << std::endl; } return tmp; }
解釋
首先說一下C++對(duì)內(nèi)存分配的原理。如果程序員決定用new operator向計(jì)算機(jī)申請(qǐng)一塊內(nèi)存,那么就可能會(huì)遇到內(nèi)存不夠的情況。一旦內(nèi)存不夠申請(qǐng)失敗,那么默認(rèn)情況下C++會(huì)拋出std::bad_alloc異常。但是如果你不想讓它拋出異常,而是想自己寫一個(gè)程序來處理內(nèi)存不夠的情況,那么你就可以用set_new_handler(new_handler),把new_handler指向你寫的內(nèi)存不夠的處理程序。這樣內(nèi)存不夠了的話C++就會(huì)去調(diào)用你寫的內(nèi)存不夠處理程序,然后再做后續(xù)處理。如果你寫set_new_handler(0)也就是set_new_handler(nullptr),實(shí)際上就是強(qiáng)制C++認(rèn)為你沒有自定義的內(nèi)存不夠處理程序(因?yàn)橹羔樖?嘛),所以說當(dāng)內(nèi)存不夠的時(shí)候,C++就會(huì)直接拋出std:bad_alloc異常。
因?yàn)樵谶@個(gè)例子中是一個(gè)模板函數(shù),所以說誰也不知道用戶在模板實(shí)例化的時(shí)候前面有沒有給set_new_handler指定什么自定義的內(nèi)存不夠處理函數(shù)。所以這個(gè)用set_new_handler(0),就是為了強(qiáng)制C++在內(nèi)存不夠的時(shí)候拋出std:bad_alloc,而不是去執(zhí)行什么其他自定義的內(nèi)存不夠處理程序。所以這里用set_new_handler(0)不是沒有用,而是強(qiáng)制C++在內(nèi)存不夠的時(shí)候一定要拋出std:bad_alloc異常
總結(jié)
set_new_handler(0)主要是為了卸載目前的內(nèi)存分配異常處理函數(shù),這樣就會(huì)導(dǎo)致一旦分配內(nèi)存失敗,C++就會(huì)強(qiáng)制性拋出std:bad_alloc異常,而不是跑到處理某個(gè)異常處理函數(shù)去處理。
到此這篇關(guān)于set_new_handler(0)有什么用的文章就介紹到這了,更多相關(guān)set_new_handler(0)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言實(shí)現(xiàn)程序開機(jī)自啟動(dòng)
本文給大家分享的是一則C語言實(shí)現(xiàn)開機(jī)自啟動(dòng)的代碼,主要是通過C來獲取程序路徑修改注冊表項(xiàng)來實(shí)現(xiàn),有需要的小伙伴可以參考下2016-01-01C++實(shí)現(xiàn)動(dòng)態(tài)綁定代碼分享
對(duì)于C++動(dòng)態(tài)綁定的理解,就是編譯器用靜態(tài)分析的方法加上虛擬函數(shù)的設(shè)計(jì)實(shí)現(xiàn)在程序運(yùn)行時(shí)動(dòng)態(tài)智能執(zhí)行正確虛擬函數(shù)的技術(shù)。要徹底理解動(dòng)態(tài)綁定,只需要掌握兩點(diǎn),一是編譯器的靜態(tài)編譯過程,二是虛擬函數(shù)的基本知識(shí)。只要有了這兩點(diǎn)理解,任何動(dòng)態(tài)綁定的分析都是很容易的2015-11-11OpenCV 圖像拼接和圖像融合的實(shí)現(xiàn)
本文主要介紹了OpenCV 圖像拼接和圖像融合,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08

C語言單鏈隊(duì)列的表示與實(shí)現(xiàn)實(shí)例詳解

C++實(shí)現(xiàn)LeetCode(100.判斷相同樹)

C語言對(duì)磁盤文件進(jìn)行快速排序簡單實(shí)例