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++對內(nèi)存分配的原理。如果程序員決定用new operator向計(jì)算機(jī)申請一塊內(nèi)存,那么就可能會遇到內(nèi)存不夠的情況。一旦內(nèi)存不夠申請失敗,那么默認(rèn)情況下C++會拋出std::bad_alloc異常。但是如果你不想讓它拋出異常,而是想自己寫一個程序來處理內(nèi)存不夠的情況,那么你就可以用set_new_handler(new_handler),把new_handler指向你寫的內(nèi)存不夠的處理程序。這樣內(nèi)存不夠了的話C++就會去調(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)存不夠的時候,C++就會直接拋出std:bad_alloc異常。
因?yàn)樵谶@個例子中是一個模板函數(shù),所以說誰也不知道用戶在模板實(shí)例化的時候前面有沒有給set_new_handler指定什么自定義的內(nèi)存不夠處理函數(shù)。所以這個用set_new_handler(0),就是為了強(qiáng)制C++在內(nèi)存不夠的時候拋出std:bad_alloc,而不是去執(zhí)行什么其他自定義的內(nèi)存不夠處理程序。所以這里用set_new_handler(0)不是沒有用,而是強(qiáng)制C++在內(nèi)存不夠的時候一定要拋出std:bad_alloc異常
總結(jié)
set_new_handler(0)主要是為了卸載目前的內(nèi)存分配異常處理函數(shù),這樣就會導(dǎo)致一旦分配內(nèi)存失敗,C++就會強(qiáng)制性拋出std:bad_alloc異常,而不是跑到處理某個異常處理函數(shù)去處理。
到此這篇關(guān)于set_new_handler(0)有什么用的文章就介紹到這了,更多相關(guān)set_new_handler(0)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
OpenCV 圖像拼接和圖像融合的實(shí)現(xiàn)
本文主要介紹了OpenCV 圖像拼接和圖像融合,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08

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

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