[ C++ ] set_new_handler解析

当 operator new 中malloc返回值为0(NULL)时,表示分配内存失败(可能是因为内存不足),
此时会通过_callnewh()调用用户通过set_new_handler()设定的new_handler(),用于处理错误情况。
(一般用于回收已分配内存?)

它长成这样

namespace std{
    typedef void (*new_handler){ };//一个函数指针
    new_handler set_new_handler(new_handler p) throw();
};

下面是一个小栗子👇

#include<iostream>
using namespace std;
void out_of_memory() {
	cerr << "Out of memory!!" << endl;
	abort();
}
int main() {
	set_new_handler(out_of_memory);
	while (1) {
		new int[1000];
	}
}

运行后打印"Out of memory!!"。

怎样设计一个性能优良的new_handler

  • 让更多的内存被使用。这样做的目的很简单,就是为了内存能够尽可能被operator new进行分配。实现此要求的做法是,当new_handler被调用的时候,将之前分配的内存释放给程序,以便能够继续使用。
  • 安装新的new_handler。如果当前的new_handler无法取得更多的内存,那么这个new_handler应该能够安装新的new_handler以便能够获得更多的内存空间。
  • 卸载new_handler,也就是将null指针传给set_new_handler。这样的话,一旦没有分配成功,就会抛出异常。
  • 抛出bad_alloc的异常。这样的异常不会被operator_new捕捉,因此会被传播到内存索求处。
  • 不返回。通常会调用abort或者exit。

原文在此

posted @ 2020-05-20 18:28  Cha2a_zzZ  阅读(400)  评论(0)    收藏  举报