new在什么时候会失败?

fish_kun 2008-08-19 10:31:47
在一些代码规范里面常常要提到需要对new操作符失败后的处理。
究竟是在什么样的环境下,new操作符会失败,内存用完吗?
我希望大家来讨论一下这样的情况,如果new操作符失败,系统会处在什么样的一种状态呢?
对于new操作符失败的处理,怎样才有一个好的流程呢?
在MFC7.0和.net虚拟机下,对new失败的处理用异常捕捉还是用判断空来处理呢?
...全文
566 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
fish_kun 2008-09-14
  • 打赏
  • 举报
回复
顶taodm

他说的正是我想问的!!1
taodm 2008-08-21
  • 打赏
  • 举报
回复
由一撮根本就不懂C++的人制订的“规范”,一群精通C++的人也扳不回来。
古语说得好:"与知之者谋之,而与不知者败之"。

Quote=引用楼主 fish_kun 的帖子:]
在一些代码规范里面常常要提到需要对new操作符失败后的处理。
究竟是在什么样的环境下,new操作符会失败,内存用完吗?
我希望大家来讨论一下这样的情况,如果new操作符失败,系统会处在什么样的一种状态呢?
对于new操作符失败的处理,怎样才有一个好的流程呢?
在MFC7.0和.net虚拟机下,对new失败的处理用异常捕捉还是用判断空来处理呢?
[/Quote]
e_sharp 2008-08-21
  • 打赏
  • 举报
回复
mark
iambic 2008-08-21
  • 打赏
  • 举报
回复
如果内存不足,更可能的情况是构造函数抛了异常,其次是某些非法操作导致程序crash,最后才是内存不足。
内存不足而导致new失败的情况几乎是不存在的。(可能某些嵌入式环境会出现,哪位遇到过的可以介绍下经历。)
第一种情况看《Exceptional C++》,第二种情况自己debug,第三种情况看《Exceptional C++ Style》。
xuxingok 2008-08-21
  • 打赏
  • 举报
回复
内存不够时
ymntomyimi8855 2008-08-21
  • 打赏
  • 举报
回复
没有内存时
xqls_xqls 2008-08-20
  • 打赏
  • 举报
回复
没有内存的时候
freedom0203 2008-08-20
  • 打赏
  • 举报
回复
捕捉bad_alloc异常
判断指针是否为空
hmsuccess 2008-08-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xkyx_cn 的回复:]
没有合适的可用内存时会失败,失败时默认会抛出bad_alloc异常,捕获该类型异常处理即可

参考文章:
http://www.builder.com.cn/2008/0104/696370.shtml
[/Quote]
太乙 2008-08-20
  • 打赏
  • 举报
回复
没有内存的时候!
fish_kun 2008-08-20
  • 打赏
  • 举报
回复
能不能在main函数中捕捉new失败的异常,在我看来这样比较省事。
yshuise 2008-08-19
  • 打赏
  • 举报
回复
抛出异常是指内存不够的情况下。
sutter认为根本不需要检测这些问题,我也认为这样。
因为程序慢了,早就掉出任务管理器kill掉
yeliguo12345 2008-08-19
  • 打赏
  • 举报
回复
没有可以分配得空间的时候
勇敢的天牛 2008-08-19
  • 打赏
  • 举报
回复
跟着学
lionc650 2008-08-19
  • 打赏
  • 举报
回复
operator new在无法完成内存分配请求时会抛出异常,operator new不能满足内存分配请求时,new-handler函数不只调用一次,而是不断重复,直至找到足够的内存。

一个设计得好的new-handler函数必须实现下面功能中的一种。
·产生更多的可用内存。这将使operator new下一次分配内存的尝试有可能获得成功。实施这一策略的一个方法是:在程序启动时分配一个大的内存块,然后在第一次调用new-handler时释放。释放时伴随着一些对用户的警告信息,如内存数量太少,下次请求可能会失败,除非又有更多的可用空间。
·安装另一个不同的new-handler函数。如果当前的new-handler函数不能产生更多的可用内存,可能它会知道另一个new-handler函数可以提供更多的资源。这样的话,当前的new-handler可以安装另一个new-handler来取代它(通过调用set_new_handler)。下一次operator new调用new-handler时,会使用最近安装的那个。(这一策略的另一个变通办法是让new-handler可以改变它自己的运行行为,那么下次调用时,它将做不同的事。方法是使new-handler可以修改那些影响它自身行为的静态或全局数据。)
·卸除new-handler。也就是传递空指针给set_new_handler。没有安装new-handler,operator new分配内存不成功时就会抛出一个标准的std::bad_alloc类型的异常。
·抛出std::bad_alloc或从std::bad_alloc继承的其他类型的异常。这样的异常不会被operator new捕捉,所以它们会被送到最初进行内存请求的地方。(抛出别的不同类型的异常会违反operator new异常规范。规范中的缺省行为是调用abort,所以new-handler要抛出一个异常时,一定要确信它是从std::bad_alloc继承来的。想更多地了解异常规范,参见条款m14。)
·没有返回。典型做法是调用abort或exit。

摘自 Effective C++ 条款7

1993年前,c++一直要求在内存分配失败时operator new要返回0,现在则是要求operator new抛出std::bad_alloc异常。很多c++程序是在编译器开始支持新规范前写的。c++标准委员会不想放弃那些已有的遵循返回0规范的代码,所以他们提供了另外形式的operator new以继续提供返回0功能。这些形式被称为“无抛出”,因为他们没用过一个throw,而是在使用new的入口点采用了nothrow对象:


zjw6861982 2008-08-19
  • 打赏
  • 举报
回复
一般是判空处理就够了
xkyx_cn 2008-08-19
  • 打赏
  • 举报
回复
没有合适的可用内存时会失败,失败时默认会抛出bad_alloc异常,捕获该类型异常处理即可

参考文章:
http://www.builder.com.cn/2008/0104/696370.shtml
elegant87 2008-08-19
  • 打赏
  • 举报
回复
超出内存空间时失败!
richbirdandy 2008-08-19
  • 打赏
  • 举报
回复
参考stl allocator
clhposs 2008-08-19
  • 打赏
  • 举报
回复
没有内存了,然后他就会抛出异常
加载更多回复(2)

64,642

社区成员

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

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