C++ new的nothrow关键字和new_handler用法
2024-09-04 14:41:11
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;
}
不做任何处理,抛出异常:
[root@dvrdvs 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,则会进入到死循环
最新文章
- Beta阶段第八次Scrum Meeting
- Nginx的启动、停止与重启
- 使用Maven构建RichFaces 4.x项目
- 汇编ASCII大小写转换(字符串长度$的用法)
- GO数据库
- 使用 Sahi 实现 Web 自动化测试
- HDOJ 1397 Goldbach&#39;s Conjecture(快速筛选素数法)
- Linux管道通信
- 遍历Arraylist的方法
- 在Swift中实现 oc与swift的混编
- MLlib--GBDT算法
- EntityFrameWork实现部分字段获取和修改(含源码)
- Zookeeper实现master选举
- 2018-2019-2 网络对抗技术 20165337 Exp4 恶意代码分析
- java 线程方法 ---- join()
- 白话skynet第一篇
- appendChild()方法遇到的问题
- 2017CCPC秦皇岛 C题Crusaders Quest&;&;ZOJ3983【模拟+STL】
- Error-MVC:HTTP Error 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效。
- Flex 自定义 Zlert 组件!
热门文章
- react native android应用启动画面
- thinkphp之自动完成
- rxjava 视频
- 【CodeVS 2845】排序的代价
- [Luogu2540][NOIP2016]斗地主增强版(搜索+DP)
- Luogu P4093 [HEOI2016/TJOI2016]序列 dp套CDQ
- 1.2(JavaScript学习笔记)JavaScript HTML DOM
- React事件系统入门
- Linux使用pyVLfeat库做Dense sift提示段错误(segmentation fault)详细分析
- 读懂MySQL执行计划