1.new_handler
new_handler
是在new失敗後的處理方式,該處理方式由程序員自定義。
new_handler
是一個函數指針:typedef void (*new_handler)();
.通過set_new_handler
可以設置在new失敗後調用哪個new_handler
。
2.set_new_handler
set_new_handler
用來設置當動態內存分配失敗時使用哪個new_handler
。
如果沒有設置new_handler
,即在第一次調用set_new_handler
之前,或者在調用set_new_handler
時傳入的指針是一個空指針,則動態內存分配失敗時會默認拋出bad_alloc
異常。
new_handler
需要做的事情爲:
- 1.嘗試使得更多的內存變爲空閒的,以便下次調用malloc的時候可以成功。
- 2.拋出
bad_alloc
異常或者直接使用abort()
exit()
終止程序。
// 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 () {
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;
}
3.get_new_handler
- 如果沒有使用
set_new_handler
設置過new_handler
,則返回一個空指針。 - 否則返回上次調用
set_new_handler
設置的new_handler
。