首页
新闻
论坛
群组
Blog
文档
下载
读书
Tag
网摘
搜索
.NET
Java
游戏
视频
人才
外包
培训
数据库
书店
程序员
欢迎您:
游客
| 退出
| 登录
注册
帮助
我的帖子
我参与的帖子
我的空间
我的网摘
CSDN
CSDN社区
C/C++
C++ 语言
将帖子提前
放进我的网摘
推荐给好友
我要提问
帖子加分
生成帖子
置顶
推荐(加精)
取消推荐(加精)
锁定帖子
移动帖子
取消引用
结帖去...
管理菜单
页面风格切换
标准风格
老版本论坛
new在什么时候会失败?
[已结帖,结帖人:fish_kun]
加为好友
发送私信
在线聊天
fish_kun
坤坤
等级:
可用分等级:
乞丐
总技术分:
241
总技术分排名:
54121
结帖率:
99.04%
发表于:
2008-08-19 10:31:47
楼主
在一些代码规范里面常常要提到需要对new操作符失败后的处理。
究竟是在什么样的环境下,new操作符会失败,内存用完吗?
我希望大家来讨论一下这样的情况,如果new操作符失败,系统会处在什么样的一种状态呢?
对于new操作符失败的处理,怎样才有一个好的流程呢?
在MFC7.0和.net虚拟机下,对new失败的处理用异常捕捉还是用判断空来处理呢?
问题点数:
100
回复次数:
22
显示所有回复
显示星级回复
显示楼主回复
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
xkyx_cn
飞翔的鱼
等级:
可用分等级:
掌柜
总技术分:
20216
总技术分排名:
606
2
发表于:
2008-08-19 10:38:42
1
楼 得分:
10
没有合适的可用内存时会失败,失败时默认会抛出bad_alloc异常,捕获该类型异常处理即可
参考文章:
http://www.builder.com.cn/2008/0104/696370.shtml
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
zjw6861982
张琎韡
等级:
可用分等级:
贫农
总技术分:
1363
总技术分排名:
15273
发表于:
2008-08-19 10:39:00
2
楼 得分:
0
一般是判空处理就够了
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
lionc650
coder
等级:
可用分等级:
富农
总技术分:
1565
总技术分排名:
13555
发表于:
2008-08-19 10:39:03
3
楼 得分:
20
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对象:
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
Lx_china
萝卜
等级:
可用分等级:
中农
总技术分:
821
总技术分排名:
22943
发表于:
2008-08-19 10:41:55
4
楼 得分:
0
跟着学
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
yeliguo12345
忍者神龟
等级:
可用分等级:
中农
总技术分:
456
总技术分排名:
35296
发表于:
2008-08-19 10:43:38
5
楼 得分:
0
没有可以分配得空间的时候
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
yshuise
等级:
可用分等级:
中农
总技术分:
1817
总技术分排名:
12329
发表于:
2008-08-19 12:25:30
6
楼 得分:
0
抛出异常是指内存不够的情况下。
sutter认为根本不需要检测这些问题,我也认为这样。
因为程序慢了,早就掉出任务管理器kill掉
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
blacktea1986
等级:
可用分等级:
贫农
总技术分:
5
总技术分排名:
253903
发表于:
2008-08-19 16:15:15
7
楼 得分:
10
不光在没有可以分配得空间的时候会new失败,其他一些情况也有可能,比如:在gdi+中,假如你没有初始化gdi+,就去new Image的话 就会失败
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
chenzhp
云端漫步
等级:
可用分等级:
富农
总技术分:
3636
总技术分排名:
5927
发表于:
2008-08-19 16:53:53
8
楼 得分:
0
没有内存可以分配的时候
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
clhposs
Poss
等级:
可用分等级:
乞丐
总技术分:
2960
总技术分排名:
7352
发表于:
2008-08-19 16:59:08
9
楼 得分:
0
没有内存了,然后他就会抛出异常
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
richbirdandy
阿2
等级:
可用分等级:
中农
总技术分:
2580
总技术分排名:
8406
发表于:
2008-08-19 18:23:08
10
楼 得分:
0
参考stl allocator
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
elegant87
乘风破浪
等级:
可用分等级:
富农
总技术分:
1444
总技术分排名:
15510
发表于:
2008-08-19 19:22:22
11
楼 得分:
0
超出内存空间时失败!
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
fish_kun
坤坤
等级:
可用分等级:
乞丐
总技术分:
241
总技术分排名:
54121
发表于:
2008-08-20 16:11:05
12
楼 得分:
0
能不能在main函数中捕捉new失败的异常,在我看来这样比较省事。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
hqin6
!独行
等级:
可用分等级:
中农
总技术分:
13862
总技术分排名:
1548
发表于:
2008-08-20 16:12:19
13
楼 得分:
0
没有内存的时候!
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
hmsuccess
等级:
可用分等级:
富农
总技术分:
5665
总技术分排名:
3921
发表于:
2008-08-20 16:39:06
14
楼 得分:
10
引用 1 楼 xkyx_cn 的回复:
没有合适的可用内存时会失败,失败时默认会抛出bad_alloc异常,捕获该类型异常处理即可
参考文章:
http://www.builder.com.cn/2008/0104/696370.shtml
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
freedom0203
逆天
等级:
可用分等级:
长工
总技术分:
0
总技术分排名:
322578
发表于:
2008-08-20 16:42:48
15
楼 得分:
0
捕捉bad_alloc异常
判断指针是否为空
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
xqls_xqls
小桥流水
等级:
可用分等级:
中农
总技术分:
831
总技术分排名:
22718
发表于:
2008-08-20 17:00:59
16
楼 得分:
0
没有内存的时候
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
ymntomyimi8855
仁者无敌
等级:
可用分等级:
贫农
总技术分:
68
总技术分排名:
111747
发表于:
2008-08-21 08:13:02
17
楼 得分:
0
没有内存时
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
xuxingok
HPMAX
等级:
可用分等级:
掌柜
总技术分:
3211
总技术分排名:
6785
发表于:
2008-08-21 08:28:58
18
楼 得分:
0
内存不够时
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
iambic
等级:
可用分等级:
掌柜
总技术分:
24450
总技术分排名:
472
4
4
3
发表于:
2008-08-21 08:39:41
19
楼 得分:
20
如果内存不足,更可能的情况是构造函数抛了异常,其次是某些非法操作导致程序crash,最后才是内存不足。
内存不足而导致new失败的情况几乎是不存在的。(可能某些嵌入式环境会出现,哪位遇到过的可以介绍下经历。)
第一种情况看《Exceptional C++》,第二种情况自己debug,第三种情况看《Exceptional C++ Style》。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
e_sharp
楼长【一生何求】
等级:
可用分等级:
富农
总技术分:
3324
总技术分排名:
6500
发表于:
2008-08-21 09:34:36
20
楼 得分:
0
mark
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
taodm
taodm
等级:
可用分等级:
掌柜
总技术分:
36968
总技术分排名:
249
5
3
发表于:
2008-08-21 09:40:45
21
楼 得分:
30
由一撮根本就不懂C++的人制订的“规范”,一群精通C++的人也扳不回来。
古语说得好:"与知之者谋之,而与不知者败之"。
Quote=引用楼主 fish_kun 的帖子:]
在一些代码规范里面常常要提到需要对new操作符失败后的处理。
究竟是在什么样的环境下,new操作符会失败,内存用完吗?
我希望大家来讨论一下这样的情况,如果new操作符失败,系统会处在什么样的一种状态呢?
对于new操作符失败的处理,怎样才有一个好的流程呢?
在MFC7.0和.net虚拟机下,对new失败的处理用异常捕捉还是用判断空来处理呢?
[/Quote]
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
fish_kun
坤坤
等级:
可用分等级:
乞丐
总技术分:
241
总技术分排名:
54121
发表于:
2008-09-14 22:07:18
22
楼 得分:
0
顶taodm
他说的正是我想问的!!1
修改
删除
举报
引用
回复
将帖子提前
放进我的网摘
推荐给好友
我要提问
帖子加分
结帖去...
管理菜单
页面风格切换
标准风格
老版本论坛
网站简介
-
广告服务
-
网站地图
-
帮助
-
联系方式
-
诚聘英才
-
English
-
问题报告
北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
abc推荐给好友