網(wǎng)站首頁 編程語言 正文
出自《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ù)去處理。
原文鏈接:https://blog.csdn.net/qq_45254369/article/details/124774054
相關(guān)推薦
- 2022-02-15 小程序搜索框歷史記錄,去除重復(fù)搜索內(nèi)容,限制顯示條數(shù)
- 2022-10-11 ABAP 云平臺(tái)向控制臺(tái)輸出消息
- 2023-04-01 pytorch中交叉熵?fù)p失函數(shù)的使用小細(xì)節(jié)_python
- 2022-11-21 詳解React獲取DOM和獲取組件實(shí)例的方式_React
- 2022-03-15 BeanCreationException或NoSuchBeanDefinitionExceptio
- 2022-05-20 springboot心跳機(jī)制,定時(shí)任務(wù)
- 2022-07-30 jQuery?UI旋轉(zhuǎn)器部件Spinner?Widget_jquery
- 2022-05-12 在pycharm中設(shè)置快速創(chuàng)建
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支