正文

回到顶部

1. new-handler介绍

当操作符new不能满足内存分配请求的时候,它就会抛出异常。很久之前,它会返回一个null指针,一些旧的编译器仍然会这么做。你仍然会看到这种旧行为,但是我会把关于它的讨论推迟到本条款结束的时候。

1.1 调用set_new_handler来指定全局new-handler

在operator new由于不能满足内存分配要求而抛出异常之前,它会调用一个客户指定的叫做new-handler的错误处理函数。(这也不是完全正确的。Operator new的真正行为更加复杂。详细内容在Item 51中描述。)为了指定内存溢出处理(out-of-memory-handling)函数,客户可以调用set_new_handler函数,这个标准库函数被声明在<new>中:

1 namespace std {2 typedef void (*new_handler)();3 new_handler set_new_handler(new_handler p) throw();4 }

 

正如你所看到的,new_handler是一个函数指针的typedef,这个函数没有参数没有返回值,set_new_handler是一个参数和返回值都为new_handler的函数。(函数set_new_handler声明结束处的”throw()”是一个异常指定(exception specification)。从本质上来说它的意思是说这个函数不会抛出任何异常,然而事实更加有意思。详细内容见Item 29。)

set_new_handler的参数是指向函数的指针,operator new会在请求的内存无法分配的情况下调用这个函数。Set_new_handler的返回值也是指向函数的指针,返回的是在调用set_new_handler之前调用的new_handler函数(也就是在new_handler被替换之前的函数)。

网友评论