C++动态内存:(三) new-handler和set_new_handler

来源:互联网 发布:win10桌面软件不见了 编辑:程序博客网 时间:2024/06/06 08:07

一、函数说明

当operator new()找不到足够大的连续内存块来安排对象。new-handler函数将会被调用。

typedef void (*new_handler)();new_handler set_new_handler(new_handler p)throw();
new_handler是个typedef,定义出一个指针指向函数,该函数没有参数也不返回任何东西。set_new_handler则是设置新的new_handler并返回当前的new_handler。当operator new()无法分配内存足够内存时新设置的new_handler被调用。

二、使用说明

1、如果set_new_handler()的参数设置为0(即没有安装任何new_handler),operator new会在内存分配不成功时抛出异常。

2、可以将set_new_handler函数中的参数p设为0,来获取当前的new_handler;

#include<iostream>using namespace std;void outofMem(){abort();}int main( ){new_handler p=set_new_handler(outofMem);new_handler p1=set_new_handler(0);cout<<outofMem<<" "<<p1<<endl;return 0;}


3、当operator new无法满足内存申请时,它会不断调用new_handler函数,直到找到足够内存或者退出。因此new_handler函数必须至少做以下事情之一或者组合:

(1)让更多内存可被使用:可以在程序一开始执行就分配一大块内存,然后new-handler第一次被调用时,将它们还给程序使用。

(2)安装另一个new_handler。如果当前的new_handler无法获取更多内存,它可以安装另外具有此能力的new_handler.

(3)卸除new_handler。将null指针传给set_new_handler()。这样在operator new内存分配不成功时会抛出异常。

(4)抛出bad_alloc(或派生自bad_alloc的异常)

(5)不返回。调用abort或者exit。

4、C++不支持类专属的new_handlers。因此如果想要让类对象内存分配错误时调用自己的new_handler,可以给类提供自己的set_new_handler和operator new。

5、new-handler的行为于operator new()绑在仪器,如果已经重载了operator new(),则new-handler将不会按默认调用。如果仍想调用new-handler则我们必须在重载了的operator new()的代码中加上这些工作的代码。


参考资料:

1、《C++编程思想》

2、《Effective C++》


0 0
原创粉丝点击