new 失败的有关问题
发布时间:2011-06-28 19:44:02 文章来源:www.iduyao.cn 采编人员:星星草
new 失败的问题
c++ 标准 new 失败是抛出异常的,new(std::nothrow) 才返回 NULL
为什么公司里面就都用 NULL 判断呢? 好像公司里面好多人都不知道异常怎么用的?
有多少公司的代码是异常安全的?
求解?
看着他们的代码实在是头大
------解决方案--------------------
因为好多公司都禁用异常.
------解决方案--------------------
------解决方案--------------------
代码比较古老了 曾经的new是失败返回NULL的 而之所以现在又nothrow也是为了向下兼容
------解决方案--------------------
异常处理显得代码有些冗长,用NULL判断更方便些,在编码上少敲几个字母就是胜利了,不过条件不出错
------解决方案--------------------
C++的代码本来就不容易写,要追求异常安全就更难了。不过,对于申请内存来说,绝大多数程序,不太会失败。就算失败了,由于内存耗尽而crash的应用程序也可以接受。对于64位的应用来说,更是如此。因此,应用程序虽然异常不安全,但大多数情况下也能凑和着用。
------解决方案--------------------
没有思考过这个问题,翻了资料,
楼主说的是对的,抛出bad_alloc异常来,注:并没有说会返回null
只有 另外一个版本:
void* operator new(大小,nothrow); 这个分配失败才会返回NULL.
用法: int* p= new(nothrow) int;
if(p==NULL)
{
}
else
{
}
------解决方案--------------------
malloc倒是会 返回NULL.
教材害死人啊, 我记得我以前的教材也是这样检测的。
顺便问个问题, operator new(大小) operator new(大小,const std::nothrow&) thrown();
这两个版本 官方说,不需要包含什么头文件,什么原因???
平时我们用任何函数,都是需要包含头文件的, new 运算符的本质是调用 operator new函数。。。。
为什么不包含头文件呢???
------解决方案--------------------
这不都关键字了吗...
------解决方案--------------------
我们在大学学C++的时候都不讲异常处理的。。。都自己看得
------解决方案--------------------
我们的目的是为了让程序健壮,而不是出了点问题就让程序直接退出。
先弄清异常与错误的分别吧。
------解决方案--------------------
检查一下连接库用的是哪个版本的new
------解决方案--------------------
异常是很方便的功能,但并不是必须的功能
第一,较小的程序,架构较简单的程序,不必非要用异常
第二,异常机制是要消耗资源的,有些时候能省则省,例如《more effective c++》
------解决方案--------------------
new出错是要出异常的,因此后边的判断if (NULL == p)根本执行不到,只不过异常一般用的比较少而已
------解决方案--------------------
使用new ,然后判断返回是否为NULL的意义不大,除非你用的实际上是malloc
可以考虑用try() catch()
------解决方案--------------------
因为bad_alloc并不总是存在,C++允许编译器使用空异常规范的分配函数,这时候就只有NULL了。
------解决方案--------------------
这个问题我以前也疑惑过,按标准来说
int * p = new p;
if( p == NULL )
{
// 按照标准如果不指定nothrow,这里是不执行的
}
但事实是,我们的代码能正常执行,其实这个很多人都不知道,我在网上也问了很久,后来有人说,
这是编译器做的更改.微软的编译器,不管你指没指定nothrow,代码都是执行的,所以没有人去关注nothrow了。现在默认都是这样写的了。
------解决方案--------------------
主要是普通开发人员处理不好内存,而new这个东西,必然要编译器处理,系统就越做越多,干脆隐藏了动作。
------解决方案--------------------
不懂什么问题
------解决方案--------------------
楼上说 #define new new(std::nothrow)
mfc中的 new也是被重新定义了,貌似叫:DEBUG_NEW 吧,也是一个宏
你定义后,会和mfc冲突了,造成它的无效啊。
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。
其他相似内容:
-
身为程序员一定要学C吗?还是直接学其他语言就可以了?
本来有javascript基础.
但想学c++或者c#.不知道从何开始.
有一次在某网站看...
-
有用双屏幕开发的吗?
RT,本人新手,昨天公司发了个大屏幕的显示器,本来是笔记本,结果我双屏幕切换时把两个显卡驱动都禁用了,两个显示器...
-
急!Microsoft Visual Studio 2010图标显示问题!
一开始我是把VS的那个无穷大似的图标锁定在任务栏里的,后来解锁了,然后桌面上、开始...
-
AIX下如何得知一个文件是否被进程打开?
问题可以参考
http://topic.csdn.net/u/20110809/23/d4d8db23-07eb-4ac3-b212-c5a010820c...
-
推荐一款2000左右的智能机
RT~
------解决方案--------------------
merry christmas
------解决方案--------------------
小...
-
关于 % 的小问题,求解
有这样一句提示信息:
printf("n请输入一个型如2+3*(4+5)-3^2%4*6/2的表达式n");
但在运行后输出是:
请输入...
-
新手求助
大家好,鄙人刚来,菜鸟一个,想知道如何下载别人上传的资源,为什么没有下载链接,是需要一定的分数才能下载还是怎么回事?希望好...
-
CSDN有搜索自己发言或者某人发言的功能吗
请指教
------解决方案--------------------
没有。。。
------解决方案------------...
-
订到2张回成都的车票, 不容易啊, 散分
12点左右就每5分钟刷一次, 从13号到16号就一直只有无坐...
13:55 刷出3张硬卧, 大喜, 结...
-
计算机专业大四应该学点什么东西呢?
我现在的情况是已经保研,计算机专业专业硕士。现在大四上半学期快结束了,寒假和下学期除了毕业...