早期malloc分配时,如果内存耗尽分配不出来,会直接返回NULL。现在分配不出来,直接抛出异常(可使用nothrow关键字)
今天和同事review代码时,发现这样的一段代码:
Manager * pManager = new Manager();
if(NULL == pManager)
{
//记录日志
return false;
}
然后,一个同事就说这样写欠妥,应该改为:
Manager * pManager = NULL;
try
{
pManager = new Manager();
}
catch(std::bad_alloc e)
{
//...
}
我查了一下资料,发现:
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;
}
}
http://blog.csdn.net/huyiyang2010/article/details/5984987
早期malloc分配时,如果内存耗尽分配不出来,会直接返回NULL。现在分配不出来,直接抛出异常(可使用nothrow关键字)的更多相关文章
- C:malloc/calloc/realloc/alloca内存分配函数
原文地址:http://www.cnblogs.com/3me-linux/p/3962152.html calloc(), malloc(), realloc(), free(),alloca() ...
- malloc/calloc/realloc/alloca内存分配函数
calloc(), malloc(), realloc(), free(),alloca() 内存区域可以分为栈.堆.静态存储区和常量存储区,局部变量,函数形参,临时变量都是在栈上获得内存的,它们获取 ...
- 栈 堆 stack heap 堆内存 栈内存 内存分配中的堆和栈 掌握堆内存的权柄就是返回的指针 栈是面向线程的而堆是面向进程的。 new/delete and malloc/ free 指针与内存模型
小结: 1.栈内存 为什么快? Due to this nature, the process of storing and retrieving data from the stack is ver ...
- 从malloc中窥探Linux内存分配策略
malloc函数是C/C++中常用内存分配库函数,本篇文章将以Linux平台上的malloc为剖析对象,深入了解分配一块内存的旅程. malloc入门 使用malloc,需要包含头文 ...
- 几个系统调用分析 glibc中的malloc调用和共享内存原理
本文主要分析内存以及I/O相关的系统调用和库函数的实现原理,根据原理给出在使用过程中需要注意的问题和优化的侧重点,本文涉及到的系统调用包括readahead,pread/pwrite,read/wri ...
- 重新定义malloc和free 防止内存泄漏
1, 定义供应用程序使用的头文件//libmem.h#ifndef _LIBMEM_H_#define _LIBMEM_H_ //声明自定义malloc及free函数extern void *my_m ...
- 关于malloc申请的动态内存的问题
http://bbs.bccn.net/thread-331344-1-1.html #include<stdio.h>#include<stdlib.h>int main(v ...
- C语言malloc()函数:动态分配内存空间
头文件:#include <stdlib.h> malloc() 函数用来动态地分配内存空间(如果你不了解动态内存分配,请查看:C语言动态内存分配及变量存储类别),其原型为:void* m ...
- 浅析C++内存分配与释放操作过程——三种方式可以分配内存new operator, operator new,placement new
引言:C++中总共有三种方式可以分配内存,new operator, operator new,placement new. 一,new operator 这就是我们最常使用的 new 操作符.查看汇 ...
随机推荐
- 在RedHa上安装MRTG监控网卡流量
http://os.51cto.com/art/201103/252149.htm 2011-03-30 15:05 张微波 phpchina 字号:T | T 在RedHa上安装MRTG监控网卡流量 ...
- Fragment使用LocalBroadcastManager接收广播消息
这种方式不用在配置文件加东西 变量声明 LocalBroadcastManager broadcastManager; IntentFilter intentFilter; BroadcastRece ...
- 【转】优先队列priority_queue 用法详解
http://www.cnblogs.com/void/archive/2012/02/01/2335224.html 优先队列是队列的一种,不过它可以按照自定义的一种方式(数据的优先级)来对队列中的 ...
- JavaScript学习笔记八
本文依据慕课网课程<JavaScript进阶>学习整理 第8章 浏览器对象 8-1 window对象 window对象是BOM的核心.window对象指当前的浏览器窗体. wind ...
- 阿里云域名和ip绑定步骤
阿里云域名和ip绑定步骤 一.总结 一句话总结:域名转IP信息存在所在地运营商那,比如电信联通等. 1.给域名添加对应ip的过程叫做什么? 域名解析 2.域名解析中的记录代表什么意思,记录值呢? 记录 ...
- Android招財进宝手势password的实现
这几个月都是在做招財进宝项目.一个高收益低风险的理財APP,有兴趣的能够下载玩玩.收益不错哦! ! ! 招財进宝下载地址:http://8.shengpay.com/ 前段时间因产品需求,做了一个手势 ...
- 【t040】SETI任务
Time Limit: 1 second Memory Limit: 128 MB [问题描述] Sqybi的电脑在做一个任务,就是SETI@home,据说这个任务在全世界有500 多万台电脑在同时做 ...
- XMPP之ios即时通讯客户端开发-创建工程添加XMPPFramework及其他框架(三)
XMPPFramework GitHub: https://github.com/robbiehanson/XMPPFramework 获取源代码 git clone https://github.c ...
- PostThreadMessage发送进程间消息(对话框向控制台发消息,控制台也可有消息循环)
函数原型 BOOL PostThreadMessage( DWORD idThread, UINT Msg, WPARAM wParam, LPARAM lParam ); 1 2 3 4 5 6 T ...
- Running as a packaged application--- -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n
19.2 Running as a packaged application If you use the Spring Boot Maven or Gradle plugins to create ...