关于在vc6.0中使用set_new_handler的问题
来源:互联网 发布:three.js vr全景漫游 编辑:程序博客网 时间:2024/05/18 15:55
关于在vc6.0中使用set_new_handler的问题
当运算符new找不到足够大的连续内存块来为对象分配内存时将会发生什么?一个称为 new-handler的函数被调用。
对于new-handler的缺省动作是抛出一个异常。然而,如果我们在程序里用堆分配,至少要用“内存已用完”的信息代替 new-handler,并异常中断程序。用这个办法,在调试程序时会得到程序出错的线索。
出错的代码例子
#include <iostream>#include <new>using namespace std;void NoMoreMemory(){ cerr << "Unable to satisfy request for memory\n"; abort(); return 0;}int main (int argc, char* argv[]){ set_new_handler(NoMoreMemory); int *pBigDataArray = NULL; pBigDataArray = new int [100000000000000 * 1000000000000]; if(NULL == pBigDataArray) { cout << "alloc memory failed!" << endl; } else { delete pBigDataArray; } return 0;}
vc6.0编译器报错
Assertion failed: new_p == 0, file setnewh.cpp, line 52
错误原因
原来是vc6.0编译器没有实现c++标准的set_new_handler()。vc6.0建议使用<new.h>中定义的_set_new_handler()。vc6.0为了防止用户使用set_new_handler()函数,在<setnewh.cpp> 的set_new_handler() 中插入了一行 assert(new_p == 0);
解决方法
将set_new_handler()换成 _set_new_handler()。将回调函数声明类型修改为int __cdecl noMemory(unsigned int anc)
修改正确的代码例子
#include <iostream>#include <new.h>using namespace std;int __cdecl NoMoreMemory(unsigned int){ cerr << "Unable to satisfy request for memory\n"; abort(); return 0;}int main (int argc, char* argv[]){ _set_new_handler(NoMoreMemory); int *pBigDataArray = NULL; pBigDataArray = new int [100000000000000 * 1000000000000]; if(NULL == pBigDataArray) { cout << "alloc memory failed!" << endl; } else { delete pBigDataArray; } return 0;}
原文出处
0 0
- 关于在vc6.0中使用set_new_handler的问题
- 学习中遇到的问题-关于set_new_handler()
- 关于VC6.0中msdn的使用
- 关于 set_new_handler的总结
- 关于 set_new_handler的总结
- 在VC6.0中关于Debug和Release两种版本的问题
- 关于vc6.0下使用DirectX 9的中输入输出设备编译不同过的问题
- 关于VC6.0版ASCII码在源代码中使用紊乱的测试
- 《STL源码剖析》中关于set_new_handler的理解
- vc6.0 中关于友元的一个问题
- VC6.0中SDI中使用CArray的问题
- 我的---关于在VC6.0中开发多国语言显示问题的总结---(有源码作为部分参考
- VC6.0使用的问题
- 在VC6.0中使用新版的MSDN
- 在VC6.0中使用GDI+的两种办法
- 在VC6.0中使用GDI+的两种办法
- 在VS2010,VC6.0中使用SkinMagicToolkit的不同比较
- 关于set_new_handler
- javascript基础一
- javaScript概念学习
- 创建本地索引和全局索引
- servlet过滤器防xss,sql注入.filter里修改parameter参数
- myeclipse 启动weblogic: java.lang.OutOfMemoryError: PermGen space
- 关于在vc6.0中使用set_new_handler的问题
- junit测试入门实例
- 黑马程序员_学习笔记第6天——静态、单例
- C# 阴影复制
- C语言--break语句和continue语句
- linux之cut用法
- 一些简单的编程练习题
- hash 算法面试题解析
- htllo