日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++中的new_handler

發(fā)布時間:2023/12/4 c/c++ 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++中的new_handler 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原文地址:http://blog.csdn.net/wzq981264/article/details/673630

在過去或者傳統(tǒng)的模式中,當(dāng)operator new不能滿足一個內(nèi)存分配請求的時候,它會返回一個空指針,但是現(xiàn)在如果operator new不能滿足一個內(nèi)存分配請求的時候,會拋出一個異常,這個時候我們可不可以自己定制處理策略呢?這正是new_handler的作用所在,具體情況在后面詳細道來。

當(dāng)operator new申請一個內(nèi)存失敗時,它會進行如下的處理步驟:
1、如果存在客戶指定的處理函數(shù),則調(diào)用處理函數(shù)(new_handler),如果不存在則拋出一個異常。new_handler的模型為:void (*new_handler)()。
2、繼續(xù)申請內(nèi)存分配請求。
3、判斷申請內(nèi)存是否成功,如果成功則返回內(nèi)存指針,如果失敗轉(zhuǎn)向處理步驟1。

可以用如下的代碼表示:
全局部分:?
void (*class_new_oom_handler)();
......

operator new執(zhí)行方法中:

void (*my_new_oom_handler)(); void *result;for( ; ; ) {my_new_oom_handler = class_new_oom_handler;if( my_new_oom_handler == NULL )THROW_BAD_NEW; //如果沒有設(shè)置自定義處理函數(shù),則默認的處理方式為拋出一個異常 (*my_new_oom_handler)(); //調(diào)用自定義內(nèi)存異常處理函數(shù)result = malloc( n ); //繼續(xù)申請內(nèi)存if( result )return( result ); //申請成功,返回指針 }

說了這么多,大家一定會問,那我怎么設(shè)置這個處理函數(shù)(new_handler),通過“void set_new_handler( void(*new_handler)()) throw();”進行設(shè)置,它定義在<new>標(biāo)準(zhǔn)函數(shù)庫中:

namespace std {void (*new_handler)();void set_new_handler( new_handler )throw(); } //error-handling function void MemErrorHandling() {std::cerr << "Failed to allocate memory.\n";std::abort(); } ... ... std::set_new_handler(MemErrorHandling);

?

現(xiàn)在我們知道了new操作失敗后,系統(tǒng)地大概處理流程,以及怎么設(shè)置用戶自定義處理函數(shù),但是我們究竟可以在new_handler中做些什么處理呢?

1、刪除其它無用的內(nèi)存,使系統(tǒng)具有可以更多的內(nèi)存可以使用,為下一步的內(nèi)存申請作準(zhǔn)備。
2、設(shè)置另外一個new_handler。如果當(dāng)前的new_handler不能夠做到更多的內(nèi)存申請操作,或者它知道另外一個new_handler可以做到,則可以調(diào)用set_new_handler函數(shù)設(shè)置另外一個new_handler,這樣在operator new下一次調(diào)用的時候,可以使用這個新的new_handler。
3、卸載new_handler(通過set_new_handler(0)),使operator new在下一次調(diào)用的時候,因為new_handler為空拋出內(nèi)存申請異常。
4、拋出自定義異常。
5、不再返回,調(diào)用abort或者exit退出程序。

參考:
1、http://www.bc-cn.net/Article/kfyy/cjj/jszl/200604/4002.html

總結(jié)

以上是生活随笔為你收集整理的c++中的new_handler的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。