关于 set_new_handler的总结

来源:互联网 发布:上海艾诺科软件 编辑:程序博客网 时间:2024/05/22 15:33

当运算符new找不到足够大的连续内存块来为对象分配内存时将会发生什么?一个称为 new-handler的函数被调用。

对于new-handler的缺省动作是抛出一个异常。然而,如果我们在程序里用堆分配,至少要用“内存已用完”的信息代替 new-handler,并异常中断程序。用这个办法,在调试程序时会得到程序出错的线索。

例子

void noMemory()
{
printf("no enough memory");
}

int main(int argc, char* argv[])
{
printf("Hello World!\n");
set_new_handler(noMemory);
int *pTest = new int[1000000000];
return 0;
}

使用set_new_handler()时候,在VC6中出现如下错误提示:

错误提示:Assertion failed: new_p == 0, file setnewh.cpp, line 52

原因:VC6没有实现C++标准要求的 set_new_handler(),即在VC6中不能使用set_new_handler()。VC6建议使用 <new.h> 的 _set_new_handler()。为了防止你使用 set_new_handler(),VC6在<setnewh.cpp> 的set_new_handler() 中插入了一行 assert(new_p == 0);。

在VC6以后的版本(如.NET)中就可以正常使用C++标准规定的 set_new_handler()了。

解决方法:将set_new_handler()换成 _set_new_handler()。将回调函数声明类型修改为int __cdecl noMemory(unsigned int anc)