new_handler/set_new_handler/get_new_handler

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

在這裏插入圖片描述

  1. 如果沒有使用set_new_handler設置過new_handler,則返回一個空指針。
  2. 否則返回上次調用set_new_handler設置的new_handler
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章