C++ new 用法的一点记录

最近在学习C++,在C++中分配内存使用new,那么我们如何判断是否申请成功,是否和C语言的方式相同,通过判空呢?

在网上查找相关的资料,有人提到直接判空仍然是会有问题的,我特意写了下代码测试,代码如下:

#include <iostream>

using namespace std;

int main(int argc, char *argv[])

{

char *p_test = NULL;

while (1)

{

p_test = NULL;

p_test = new char[1000000];

if (p_test == NULL)

{

cout << "new have some wrong" << endl;

return -1;

}

}

cout << "break while " << endl;

return 0;

}

在ubuntu上进行测试,出现以下的信息:

terminate  called after throwing an instance of  'std::bad_alloc'

what(): std:bad_alloc

Aborted(core dumped)



当将上面修改成:

while (1)

{

p_test = NULL;

try

{

p_test = new char[1000000];

}

catch(exception e)

{

cout << "new have some wrong:" << e.what() << endl;

return -1;

}

}

运行结果如下:

new have some wrong: std::exception


上面的std::exception的信息即e.what()的信息是从哪来的,请注意上面标记的两个蓝色地方,

当我们将

catch(exception e)修改成catch(std::bad_alloc e)时,输出的信息就是std::bad_alloc。


比较下上面两处结果,第一种情况下压根就没有进入到 if 的判断逻辑里面,也就是说即使new失败了,也不返回NULL。


做C开发习惯了用 if  判空方式来进行判断内存是否正常分配,在C++也可以这么做,具体如下:

 

#include <iostream>

using namespace std;

int main(int argc, char *argv[])

{

char *p_test = NULL;

while (1)

{

p_test = NULL;

p_test = new(nothrow) char[1000000];

if (p_test == NULL)

{

cout << "forbidden new throw, new have some wrong" << endl;

return -1;

}

}

cout << "break while " << endl;

return 0;

}

禁止new失败时抛出异常,运行结果如下:


forbidden new throw, new have some wrong



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值