用operator new申请内存失败会做一些什么

面试官可能问你你怎么答

首先,用operator new来申请内存,若内存申请失败,则会抛出bad_alloc异常.这是很简单的回答,但是是错误的.

 

正确理解

因为namespace std定义了一个set_new_handle函数,函数如下:
Typedef void (*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_handler函数,则内存申请失败前不会先抛出异常,
而是去反复调用new_handler指向的函数.
该函数一般设计是去释放一些无用的内存.可以事先给该函数分配一块大内存.
之后若一直申请都是失败还是如何可能就得看自己设计的new_handler指向的函数考虑了.

如果operator new之前尚未定义set_new_handler,如果内存申请失败,就会直接抛出bad_alloc异常.

 

operator new PK malloc
operator new对比于c语言里的malloc申请内存有一些不同
1. operator new有异常机制,malloc申请空间失败会返回NULL, operator new会选择抛异常.
2. operator new在申请对象或结构体内存时会调用构造函数,malloc不会.

posted @ 2020-12-02 21:06  Ldler  Views(198)  Comments(0Edit  收藏  举报