c++ 使用nothrow ,防止new失败 抛出异常导致程序崩溃

参考文章:http://www.cplusplus.com/reference/new/nothrow/?kw=nothrow

使用malloc时经常使用类似代码检查是否malloc成功

char *p = (char*) malloc(100000);
if(p != NULL){
	//.......
}

受其影响,一直以来都以为new也可以用此方法判断,也没出现过错误(因为从来没new失败过)
实时证明,当new失败后,并不会返回NULL ,而会直接抛出异常

char* p = (char*)-1;
while(p)
	p = new char[1000000];
cout<<"hello world"<<endl;

以上这段代码并不会停止 并输出 “hello world” ,而是抛出bad_alloc异常
在这里插入图片描述

解决方法 一

new 后面加 nothrow

char* p = (char*)-1;
while(p)
	p = new(std::nothrow) char[1000000];
cout<<"hello world"<<endl;


解决方法二

既然已经知道new可能抛出bad_alloc 异常,直接捕获就可以了

	char *p =(char*)-1;
	while(p){
		try{
			p = new char[10000000];
		}
		catch(std::bad_alloc e){
			cout<<"new failed"<<endl;
			break;
		}
	}




相比之下,
方法一更加地简便,也基本能满足需要,
方法二稍显麻烦,但是更加灵活。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]中的代码展示了在C++使用nothrow的示例。nothrow是一个常量对象,用于在使用placement new操作符时指定不抛出异常。通过使用"new(std::nothrow) 类型"的语法,可以在内存分配失败时返回一个空指针,而不是抛出std::bad_alloc异常。这与标准的new操作符的行为不同,标准的new操作符在内存分配失败时会抛出异常。 引用\[2\]中的代码展示了nothrow_t结构的定义和使用。nothrow_t通常是一个空结构,其唯一目的是提供编译器一个可根据重载规则识别具体调用的类型。用户可以使用"new(std::nothrow) 类型"的语法来调用placement new操作符,并使用nothrow常量来指定不抛出异常。 引用\[3\]中提到,在C++中,标准的new操作符在申请内存失败时会抛出std::bad_alloc异常。为了检查new是否成功,可以使用try-catch语句来捕捉异常。然而,有些编译器不支持try-catch语句。为了解决这个问题,C++标准化委员会提供了operator new的另一种可选形式,即nothrow使用nothrow时,内存分配失败时会返回一个空指针,而不是抛出异常。这种行为可以用来替代传统的Test-for-NULL代码。 所以,总结起来,nothrowC++中用于在内存分配失败时返回一个空指针,而不抛出异常。它可以通过使用"new(std::nothrow) 类型"的语法来指定不抛出异常的方式进行使用。 #### 引用[.reference_title] - *1* *2* *3* [C++中nothrow的介绍及使用](https://blog.csdn.net/liu0808/article/details/86629987)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值