社区
C++ 语言
帖子详情
new在什么时候会失败?
fish_kun
2008-08-19 10:31:47
在一些代码规范里面常常要提到需要对new操作符失败后的处理。
究竟是在什么样的环境下,new操作符会失败,内存用完吗?
我希望大家来讨论一下这样的情况,如果new操作符失败,系统会处在什么样的一种状态呢?
对于new操作符失败的处理,怎样才有一个好的流程呢?
在MFC7.0和.net虚拟机下,对new失败的处理用异常捕捉还是用判断空来处理呢?
...全文
566
22
打赏
收藏
new在什么时候会失败?
在一些代码规范里面常常要提到需要对new操作符失败后的处理。 究竟是在什么样的环境下,new操作符会失败,内存用完吗? 我希望大家来讨论一下这样的情况,如果new操作符失败,系统会处在什么样的一种状态呢? 对于new操作符失败的处理,怎样才有一个好的流程呢? 在MFC7.0和.net虚拟机下,对new失败的处理用异常捕捉还是用判断空来处理呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
采用
new
分配内存
失败
时为什么
会
出现两种错误报告方式?
本文转载自:http://www.51testing.com/html/70/n-827070-2.html 在C++语言中,我们经常
会
使用
new
给一个对象分配内存空间,而当内存不够
会
出现内存不足的情况。C++提供了两中报告方式: 1、抛出bad_alloc异常来报告分配
失败
; 2、返回空指针,而不
会
抛出异常。 C++为什么
会
采用这两种方式呢?这主要是由于各大编译器公司设计C+...
C++为什么
new
(malloc)操作
会
失败
在系统还有充足内存的情况下(内存占用率不到45%),
new
操作
失败
(返回空指针),用malloc也是如此! 请问是什么原因?x5v A`UM9W6KK:Fh q 注:
new
操作申请的内存大小是远小于系统内存大小的。实际上只是
new
了1M的空间,而且之前
new
同样大小的内存是成功的,系统运行了一
会
儿,就
会
在这里
失败
。 一查,是
new
操作返回0, 而系统还有足够的内存
C++
new
失败
处理
1.C++里
new
分配空间
失败
C++里,
new
是最常用的分配堆空间的操作符。
new
和malloc的区别体现在这几方面: 1)
new
是操作符,malloc是函数; 2)
new
和delete操作符对应,malloc则和free函数对应; 3)
new
可以直接调用构造函数,而malloc不可以; 4)
new
...
new
失败
如何处理
需要搞清楚空间配置器之前必须分清楚C++中各种内存分配和释放的区别? 这里的问题就是当
new
分配内存
失败
该怎么办? 现在讨论的方法,在STL内存分配中使用了很多。
new
是通过调用对应的operator
new
产生的内存,并且operator
new
可以重载。C++采取的做法就是通过
new
-handler回调函数处理。当operator
new
不能满足分配需求时候,在抛出对应异常之前
会
调
当
new
分配空间
失败
时
C++用运算符
new
替代了C中的malloc函数,运算符
new
在分配内存
失败
时的行为定义被改变了好几次.最开始,是在
失败
时返回一个空值(NULL).后来,这个行为变为抛出(throw)一个异常.然而
new
所抛出的异常名也改变了好几次.最后运算符
new
在
失败
时的行为被确定为:默认情况下将产生一个异常,同时作为一种可选情况,也可以返回一个空指针.在标准C++中,当一个内存分配请求不能被满足时,
new
将
C++ 语言
64,642
社区成员
250,580
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章