C++ new的nothrow关键字和new_handler用法

C++ new的nothrow关键字和new_handler用法

new && new(std::nothrow)

new(std::nothrow) 顾名思义,即不抛出异常,当new一个对象失败时,默认设置该对象为NULL,这样可以方便的通过if(p == NULL) 来判断new操作是否成功

普通的new操作,如果分配内存失败则会抛出异常,虽然后面一般也会写上if(p == NULL) 但是实际上是自欺欺人,因为如果分配成功,p肯定不为NULL;而如果分配失败,则程序会抛出异常,if语句根本执行不到。

因此,建议在c++代码中,凡是涉及到new操作,都采用new(std::nothrow),然后if(p==NULL)的方式进行判断

#include <new>
#include <iostream>
#include <stdlib.h>
#include <stdio.h>

using namespace std;

//void __cdecl newhandler()
//{
//  printf(".....%20s,%10d,,,,,,,\n", __FUNCTION__, __LINE__);
//  return;
//}

int main()
{
//  set_new_handler(newhandler);

    char *p = new char[0x2000000];
    if(NULL == p)
    {
        //记录日志
        printf(".....%20s,%10d,,,,,,,\n", __FUNCTION__, __LINE__);
        return false;
    }
    printf(".....%20s,%10d, p=0x%10x,,,,,,,\n", __FUNCTION__, __LINE__, p); 

    return 0;
}

不做任何处理,抛出异常:

[[email protected] nfs] # ./a.out
terminate calleda.out/636: potentially unexpected fatal signal 6.
 after throwing
an instance of ‘
Pid: 636, comm:                a.out

  what():  std:CPU: 0    Tainted: P             (3.0.8 #1-svn16375)
:bad_alloc
PC is at 0x40253a98
LR is at 0x40253a44
pc : [<40253a98>]    lr : [<40253a44>]    psr: 60000010
sp : bef34bb0  ip : 4029615c  fp : bef34c6c
r10: 008ae1d8  r9 : 00000000  r8 : 401ca704
r7 : 0000010c  r6 : 40296394  r5 : 00000006  r4 : 0000027c
r3 : 40296144  r2 : 00000006  r1 : 0000027c  r0 : 00000000
Flags: nZCv  IRQs on  FIQs on  Mode USER_32  ISA ARM  Segment user
Control: 0005317f  Table: 824bc000  DAC: 00000015
[<c002dd4c>] (show_regs+0x0/0x50) from [<c0055e08>] (get_signal_to_deliver+0x35c/0x384)
 r4:020c0027 r3:0000000a
[<c0055aac>] (get_signal_to_deliver+0x0/0x384) from [<c002eb70>] (do_signal+0x70/0x56c)
[<c002eb00>] (do_signal+0x0/0x56c) from [<c002f0c0>] (do_notify_resume+0x54/0x60)
[<c002f06c>] (do_notify_resume+0x0/0x60) from [<c002c194>] (work_pending+0x24/0x28)
 r4:0000027c r3:20000013
Aborted

若设置了set_new_handler,则会进入到死循环

时间: 2024-10-23 20:46:08

C++ new的nothrow关键字和new_handler用法的相关文章

关键字enum的用法

 1.为什么要用enum 写程序时,我们常常需要为某个对象关联一组可选alternative属性.例如,学生的成绩分A,B,C,D等,天气分sunny, cloudy, rainy等等. 更常见的,打开一个文件可能有三种状态:input, output和append. 典型做法是,对应定义3个常数,即: const int input = 1; const int output = 2; const int append = 3; 然后,调用以下函数: bool open_file(stri

C# defualt关键字默认值用法

原文:C# defualt关键字默认值用法 默认值表达式生成类型的默认值. 默认值表达式在泛型类和泛型方法中非常有用. 使用泛型类和泛型方法时出现的一个问题是,如何在无法提前知道以下内容的情况下将默认值赋值给参数化类型 T: T 是引用类型还是值类型. 如果 T 是值类型,它是数值还是用户定义的结构. 已知参数化类型 T 的变量 t,仅当 T 为引用类型时,语句 t = null 才有效. 赋值 t = 0 仅对数值类型有效,对结构无效. 解决方案是使用默认值表达式,该表达式对引用类型(类类型和

早期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分配时,如果

深入Java关键字this的用法的总结

在Java程序设计中经常会见到this的使用,this使得程序设计变得规范.简单.灵活.但是在使用过程中,在不同场 合它的含义并不完全相同,使用不当还会出现错误, 本文对this的几种用法和出现的问题进行了分析详解. 关键词:类:对象:this:成员变量:方法:构造方法 中,Java语言提供了丰富的类(Class).接口(Interface)以及相应的方法(Method). 使用这些类或接口,用户可以定义 自己的类或子类,并以这些类为模板创建对象(Object). 在Java语言中,当创建一个对

extern关键字的一般用法

extern关键字会提升变量或者函数的逼格,使得它们可以跨文件被访问.话虽然是这么说,使用这个关键字必须要注意一些东西. 首先,你得在cpp文件里面实现这些全局变量和全局函数,这是最基本的,然后只需要在需要用到这些变量和函数的文件里声明一下,用extern修饰声明,这样弄完之后就可以随意使用这些全局变量和全局函数了.请不要为编译器担心,担心它们找不到这些东西,只要你实现了,不怕编译器找不到. 在别的文件里写一堆的extern声明显得特别不专业,也显得代码十分臃肿,有没有好的做法呢?有的. 我们一

(转载)深入Java关键字this的用法的总结

在Java程序设计中经常会见到this的使用,this使得程序设计变得规范.简单.灵活.但是在使用过程中,在不同场 合它的含义并不完全相同,使用不当还会出现错误, 本文对this的几种用法和出现的问题进行了分析详解. 关键词:类:对象:this:成员变量:方法:构造方法 中,Java语言提供了丰富的类(Class).接口(Interface)以及相应的方法(Method). 使用这些类或接口,用户可以定义 自己的类或子类,并以这些类为模板创建对象(Object). 在Java语言中,当创建一个对

【转】SQL 常用关键字释义和用法

转自: http://blog.csdn.net/iamwangch/article/details/8093933 下面 是 从网络上整理 出来的 SQL 关键字和 常用函数的 释义和简单用法. 1.1 SELECT SELECT 语句用于从表中选取数据. 结果被存储在一个结果表中(称为结果集). 语法: view plain SELECT 列名 FROM 表名 view plain SELECT * FROM 表名 view plain eg:select * from table_a; 1

JAVA线程安全之synchronized关键字的正确用法

JAVA线程安全关于synchronized关键字的用法,今天才知道原来我一直错了.以为用了synchronized关键字包住了代码就可以线程同步安全了. 测试了下.发现是完全的错了.synchronized必须正确的使用才是真正的线程安全...虽然知道这种写法,一直以为却由于懒而用了错误的方法. 看来基础还没有打好.仍需复习加强!工作中犯这种错误是不可原谅的,要知道使用synchronized关键字的地方都是数据敏感的!汗一把... 先贴代码: [java] view plaincopypri

js 中关键字 this的用法

<1>  js中this 的用法?  (key:函数是由调用的,四种情况标红可知) (http://www.ruanyifeng.com/blog/2010/04/using_this_keyword_in_javascript.html) this 关键字指的是函数在运行时,自动生成的内部对象,只能在函数内部使用,随着函数使用场合的变化this 的值也会发生变化,但是总原则是,this指的是调用函数的那个对象   =>范围:函数内部    对象:调用函数的那个对象 this使用的四种情