new发生异常的返回值

最近写工程的时候突然发现new异常时并不会返回一个NULL指针,吓到了= =#

看了一下,原来C++全部讲这种东东转化成抛出异常了。。。

ORZ。。。

以下是某位工业界人物写的:


我们知道,使用malloc/calloc等分配内存的函数时,一定要检查其返回值是否为“空指针”(亦即是检查分配内存的操作是否成功),这是良好的编程习惯,也是编写可靠程序所必需的。但是,如果你简单的把这一招应用到new上,那就不一定正确了。我经常看到类似这样的代码:

    int* p = new int[SIZE];

        if(p==0) //检查p是否空指针

            return -1;

        //其他代码

    其实,这里的 if( p==0 )完全是没啥意义的。C++里,如果new分配内存失败,默认是抛出异常的。所以,如果分配成功,p==0就绝对不会成立;而如果分配失败了,也不会执行if( p==0 ),因为内存分配失败时,new就会抛出异常跳过后面的代码如果你想检查new是否成功,应该捕捉异常

    try{

        int* p = new int[SIZE];

        //其他代码

    }catch( const bad_alloc& e ){

        return -1;

    }

    据说一些老的编译器里,new如果分配内存失败,是不抛出异常的(大概因为那时C++还没加入异常机制),而是和malloc一样,返回空指针。不过,我从来都没有遇到过new返回空指针的情况。

    当然,标准的C++亦提供了一个方法来抑制new抛出异常,而返回空指针

    int* p = new (std::nothrow) int; //这样,如果new失败了,就不会抛出异常,而是返回空指针

        if( p==0 )//如此这般,这个判断就有意义了

            return -1;

            //其他代码

文章出处:http://tech.ddvip.com/2009-05/1242375623119337.html

 

P.S.

C++中new的用法(http://blog.csdn.net/pengzhixi/archive/2009/06/17/4274984.aspx)

C++中,new的用法很灵活,这里进行了简单的总结:

1. new() 分配这种类型的一个大小的内存空间,并以括号中的值来初始化这个变量

2. new[] 分配这种类型的n个大小的内存空间,并用默认构造函数来初始化这些变量

#include <iostream>

#include <cstring>

using namespace std;

int main()

{

    //char* p = new char("Hello");

    //error分配一个char(1字节)的空间

    //用"Hello"来初始化,这明显不对

    char* p = new char[6];

    //p = "Hello";

    //不能将字符串直接赋值给该字符指针p,原因是:

    //指针p指向的是字符串的第一个字符,只能用下面的

    //strcpy

    strcpy(p, "Hello");

    cout<<*p<<endl; //只是输出p指向的字符串的第一个字符!

    cout<<p<<endl;  //输出p指向的字符串!

    delete[] p;

    return 0;

}

输出结果:

H

Hello

3. 当使用new运算符定义一个多维数组变量或数组对象时,它产生一个指向数组第一个元素的指针,返回的类型保持了除最最左边维数外的所有维数。例如:

int *p1 = new int[10];

返回的是一个指向int的指针int*

int (*p2)[10] = new int[2][10];

new了一个二维数组,去掉最左边那一维[2],剩下int[10],所以返回的是一个指向int[10]这种一维数组的指针int(*)[10].

int (*p3)[2][10] = new int[5][2][10]; new了一个三维数组,去掉最左边那一维[5],还有int[2][10],所以返回的是一个指向二维数组int[2][10]这种类型的指针int (*)[2][10].

#include <iostream>

#include <typeinfo>

using namespace std;

int main()

{

    int* a = new int[34];

    int* b = new int[];

    int (*c)[2] = new int[34][2];

    int (*d)[2] = new int[][2];

    int (*e)[2][3] = new int[34][2][3];

    int (*f)[2][3] = new int[][2][3];

    a[0] = 1;

    b[0] = 1; //运行时错误,无分配的内存,b只起指针的作用,用来指向相应的数据

    c[0][0] = 1;

    d[0][0] = 1; //运行时错误,无分配的内存,d只起指针的作用,用来指向相应的数据

    e[0][0][0] = 1;

    f[0][0][0] = 1; //运行时错误,无分配的内存,f只起指针的作用,用来指向相应的数据

    cout<<typeid(a).name()<<endl;

    cout<<typeid(b).name()<<endl;

    cout<<typeid(c).name()<<endl;

    cout<<typeid(d).name()<<endl;

    cout<<typeid(e).name()<<endl;

    cout<<typeid(f).name()<<endl;

    delete[] a;

    delete[] b;

    delete[] c;

    delete[] d;

    delete[] e;

    delete[] f;

}

输出结果:

int*

int*

int (*)[2]

int (*)[2]

int (*)[2][3]

int (*)[2][3]

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值