C++中的new_handler、set_new_handler、get_new_handler函数

写在前面

在operator new或者operator new[]内存分配失败时,会不止一次调用由client指定的handler(当然handler也有默认形式),可以有源码中发现

void* operator new(size_t size,const std::nothrow_t&)_THROW0()
{
	void* p;
	while((p==malloc(size))==0)
	{
		_TRY_BEGIN
			if(_callnewh(size)==0) break;
		_CATCH(std::bad_alloc) return (0);
		_CATCH_END
	}
	return (p);
}

这里面的_callnewh就是我们定义的new_handler

new_handler函数

new_handler函数原型为:

typedef void (*new_handler)();

这是一个没有参数返回值为void类型的typedef,用作set_new_handler的参数和返回值类型

set_new_handler函数

函数原型为:

new_handler set_new_handler (new_handler new_p) throw();    //c++98
new_handler set_new_handler (new_handler new_p) noexcept;   //c++11

将new_handler类型的new_p设为new 处理函数,当调用operator new或者operator new[]函数分配内存失败时,则调用new_p函数

new_p函数被调用时,可以做以下事情:

  1. 获取更多的内存
  2. 抛出bad_alloc异常
  3. 终止程序,exit或abort函数

如果new_handler函数返回(即它可以获取更多的内存),则它可以重复调用,只要分配函数未能分配所请求的内存,或者直到new_handler函数返回或者被替换

默认的new_p函数为:分配内存失败时抛出bad_alloc异常

 

get_new_handler函数

函数原型为:

new_handler get_new_handler() noexcept;

如果之前调用过seT_new_handler的话,则返回当前new_handler函数的值,否则返回空指针

栗子

#include 
#include 
#include 
using namespace std;

void no_memory(){
	cout << "Failed to allocated memory!\n";
	exit(1);
}
void(*pf)();

int main()
{
	set_new_handler(no_memory);
//	pf = get_new_handler();     //set_new_handler函数 
//	pf();                       
	char* p = new char[100000000000000000000];
	cout <<"Ok!\n";
	delete[] p;
	return 0;
}

说明分配失败,调用set_new_handler函数设定的no_memory函数

参考资料

《内存管理》侯捷

http://www.cplusplus.com/reference/new/set_new_handler/

你可能感兴趣的:(C++深入)