c++杂记
来源:互联网 发布:人机界面数据记录 编辑:程序博客网 时间:2024/06/01 23:02
C++ new的nothrow关键字和new_handler用法
1.malloc分配时,如果内存耗尽分配不出来,会直接返回NULL;
2.早期C++版本,new分配时,如果内存耗尽分配不出来,也会直接返回NULL;
3.现代编译器,如gcc和VC,则都在分配不出内存时,抛出异常;
4.但是,在面对不支持异常的嵌入式环境,或者编程人员不喜欢使用异常结构时,则也有办法解决,即关键字nothrow,如以下代码:
#include <new>//必须使用new头文件
Manager * pManager = new (std::nothrow) Manager();
if(NULL == pManager)
{
//记录日志
return false;
}
5.如果您不想使用关键字nothrow,该如何解决这个问题呢?也可以解决,即替换new_handler即可。
想知道为何替换new_handler就能解决这个问题,需要理解new分配时,内存耗尽是如何抛出异常的。每当new分配内存,而没有足够的内存可供分配时,它会调用new_handler函数,而缺省的new_handler函数,会抛出throw bad_alloc()。为了避免抛出这个异常,可以替换一个不抛出异常的new_handler即可。
typedef void (*new_handler)();
new_handler set_new_handler(new_handler p) throw();
new_handler是一个自定义的函数指针类型,它指向一个没有输入参数也没有返回值的函数。
set_new_handler是一个输入并返回new_handler类型的函数。
set_new_handler的输入参数是operator new分配内存失败时要调用的出错处理函数的指针,返回值是set_new_handler没调用之前就已经在起作用的旧的出错处理函数的指针。
如以下代码:
#include <new>
#include <iostream>
#include <stdlib.h>
using namespace std;
void __cdecl newhandler()
{
return;
}
int main()
{
set_new_handler (newhandler);
Manager * pManager = new (std::nothrow) Manager();
if(NULL == pManager)
{
//记录日志
return false;
}
}
- C杂记
- C#-杂记(临时)
- C杂记(1)
- C杂记(1)
- C杂记 (2)
- 51C语言杂记
- c语言杂记
- C语言杂记
- linux C线程杂记
- C语言编程杂记
- C语言杂记
- C语言杂记1
- C语言笔记杂记
- C语言杂记.md
- C语言数据类型杂记
- C语言指针杂记
- C语言杂记1
- C语言 数据结构 杂记
- 《unix环境高级编程》信号——sigsetjmp 函数和 siglongjmp 函数
- RGB图像任意角度旋转
- javascript 函数详解2 -- arguments
- 进程-IPC 信号和信号量 (二)
- 题目1521:二叉树的镜像
- c++杂记
- 交叉编译器的信息查询
- 《unix高级环境编程》信号——sigsuspend 函数
- 第5章 列表
- FFMPEG:H264解码-SDL显示(RGB32、RGB24、YUV420P、YUV422)
- 配置IIS图解
- 理解Java的引用对象
- java 关于httpclient 请求https (如何绕过证书验证)
- 《unix高级环境编程》信号——abort、system和sleep函数