让指针初始化为NULL,反而是错误的!

yshuise 2010-09-30 12:14:22
float* p = NULL;
p = new float[10];

if(!p)
{

.........

}
上面这种写法,毫无疑问是错误的。原因在于没有深刻的理解new操作符的特性。
看下面c++标准:


void* operator new(std::size_t size) throw (std::bad_alloc);
void* operator new(std::size_t size, const std::nothrow_t& )throw();
void* operator new[](std::size_t size) throw(std::bad_alloc);
void* operator new[](std::size_t size, const std::nothrow_t&)throw();

大家知道错在哪儿吗?

...全文
1396 68 打赏 收藏 转发到动态 举报
写回复
用AI写文章
68 条回复
切换为时间正序
请发表友善的回复…
发表回复
JaneThink 2011-02-16
  • 打赏
  • 举报
回复
纠结中,还是有很多方案的。解决方案当然比问题多,但是这些方案是否真的有用呢? 如try....catch...捕捉了异常又能怎样? 内存都没法分配了。看来只有停止了。
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 taodm 的回复:]
楼主引经据典指出了new不会返回null,却还没有说C++为啥要让new不返回null。
[/Quote]
求解..
airtrack 2010-09-30
  • 打赏
  • 举报
回复
程序员里面认为new失败返回NULL的大有人在啊,麻木了。
gules 2010-09-30
  • 打赏
  • 举报
回复
NULL本来就是C的,如果要初始化也应该写:
float* p = 0;
p = new float[10];
或者用nullptr这样的东西。
xingzhe2001 2010-09-30
  • 打赏
  • 举报
回复
处理异常才可以,返回值不可靠
taodm 2010-09-30
  • 打赏
  • 举报
回复
楼主引经据典指出了new不会返回null,却还没有说C++为啥要让new不返回null。
hastings 2010-09-30
  • 打赏
  • 举报
回复
dingshaofengbinbin 2010-09-30
  • 打赏
  • 举报
回复
有意思,健壮性!容错能力!!
wyfwx 2010-09-30
  • 打赏
  • 举报
回复
new 好象没有失败的,如果这个假设成立, if可以去掉
taodm 2010-09-30
  • 打赏
  • 举报
回复
“一切按照教科书上面说的操作”,哪本教科书?
如果你选的国产或者垃圾教科书,岂不是被人卖了还帮人数钱。
hslinux 2010-09-30
  • 打赏
  • 举报
回复
没见过C++标准库中的实现,不知道异常了返回NULL还是抛出异常,还是两样都进行,一切按照教科书上面说的操作。

辩解完毕。

yshuise 2010-09-30
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 akirya 的回复:]
lz 要干啥 ?
[/Quote]
面试题的答案是错误的,我指出来而已。
  • 打赏
  • 举报
回复
lz 要干啥 ?
fangjianocean 2010-09-30
  • 打赏
  • 举报
回复
哦,原来是选中带异常(默认)或不带异常new 的系统函数。
恩,学习了。
yshuise 2010-09-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 fangjianocean 的回复:]
VC8上编译,并无错误。
不明白。
另:
float *p=NULL;
p = new float[10];
可能被编译如下伪码:
float *p=0;
p = (float*)__new(10*sizeof(int));
[/Quote]

正确的时候没有错误。
fangjianocean 2010-09-30
  • 打赏
  • 举报
回复
VC8上编译,并无错误。
不明白。
另:
float *p=NULL;
p = new float[10];
可能被编译如下伪码:
float *p=0;
p = (float*)__new(10*sizeof(int));
yshuise 2010-09-30
  • 打赏
  • 举报
回复
char* p = NULL;
p = new(std::nothrow)char[100];


才对。

这是malloc相似的方法。

第二种方法就是抛出异常的方法。

这个异常一定要写,否则就是有问题的。
  • 打赏
  • 举报
回复
其他不知道了
楼主这几天在看STL源码吧,话说我之前也研究过STL源码剖析,不过最近因为忙,所以没怎么再看

楼主,别故弄玄虚了,揭晓答案吧


向楼主学习,向所有的星星学习
Rico_Liu 2010-09-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 maoxing63570 的回复:]

愿听解释
[/Quote]
+1
yshuise 2010-09-30
  • 打赏
  • 举报
回复
提供答案就不热闹了。2楼讲了一种,还有一种可行之法。
加载更多回复(48)

64,281

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧