首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • new在什么时候会失败? [已结帖,结帖人:fish_kun]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fish_kun
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-08-19 10:31:47 楼主
    在一些代码规范里面常常要提到需要对new操作符失败后的处理。
    究竟是在什么样的环境下,new操作符会失败,内存用完吗?
    我希望大家来讨论一下这样的情况,如果new操作符失败,系统会处在什么样的一种状态呢?
    对于new操作符失败的处理,怎样才有一个好的流程呢?
    在MFC7.0和.net虚拟机下,对new失败的处理用异常捕捉还是用判断空来处理呢?
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xkyx_cn
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

    发表于:2008-08-19 10:38:421楼 得分:10
    没有合适的可用内存时会失败,失败时默认会抛出bad_alloc异常,捕获该类型异常处理即可

    参考文章:
    http://www.builder.com.cn/2008/0104/696370.shtml
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zjw6861982
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 10:39:002楼 得分:0
    一般是判空处理就够了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lionc650
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 10:39:033楼 得分: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
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 10:41:554楼 得分:0
    跟着学
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yeliguo12345
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 10:43:385楼 得分:0
    没有可以分配得空间的时候
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yshuise
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 12:25:306楼 得分:0
    抛出异常是指内存不够的情况下。
    sutter认为根本不需要检测这些问题,我也认为这样。
    因为程序慢了,早就掉出任务管理器kill掉
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • blacktea1986
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 16:15:157楼 得分:10
    不光在没有可以分配得空间的时候会new失败,其他一些情况也有可能,比如:在gdi+中,假如你没有初始化gdi+,就去new Image的话 就会失败
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • chenzhp
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 16:53:538楼 得分:0
    没有内存可以分配的时候
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • clhposs
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 16:59:089楼 得分:0
    没有内存了,然后他就会抛出异常
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • richbirdandy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 18:23:0810楼 得分:0
    参考stl allocator
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • elegant87
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 19:22:2211楼 得分:0
    超出内存空间时失败!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fish_kun
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 16:11:0512楼 得分:0
    能不能在main函数中捕捉new失败的异常,在我看来这样比较省事。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hqin6
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 16:12:1913楼 得分:0
    没有内存的时候!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hmsuccess
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 16:39:0614楼 得分:10
    引用 1 楼 xkyx_cn 的回复:
    没有合适的可用内存时会失败,失败时默认会抛出bad_alloc异常,捕获该类型异常处理即可

    参考文章:
    http://www.builder.com.cn/2008/0104/696370.shtml
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • freedom0203
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 16:42:4815楼 得分:0
    捕捉bad_alloc异常
    判断指针是否为空
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xqls_xqls
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 17:00:5916楼 得分:0
    没有内存的时候
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ymntomyimi8855
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 08:13:0217楼 得分:0
    没有内存时
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xuxingok
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 08:28:5818楼 得分:0
    内存不够时
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • iambic
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 4

      4

      3

    发表于:2008-08-21 08:39:4119楼 得分:20
    如果内存不足,更可能的情况是构造函数抛了异常,其次是某些非法操作导致程序crash,最后才是内存不足。
    内存不足而导致new失败的情况几乎是不存在的。(可能某些嵌入式环境会出现,哪位遇到过的可以介绍下经历。)
    第一种情况看《Exceptional C++》,第二种情况自己debug,第三种情况看《Exceptional C++ Style》。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • e_sharp
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 09:34:3620楼 得分:0
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • taodm
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 5

      3

    发表于:2008-08-21 09:40:4521楼 得分:30
    由一撮根本就不懂C++的人制订的“规范”,一群精通C++的人也扳不回来。
    古语说得好:"与知之者谋之,而与不知者败之"。

    Quote=引用楼主 fish_kun 的帖子:]
    在一些代码规范里面常常要提到需要对new操作符失败后的处理。
    究竟是在什么样的环境下,new操作符会失败,内存用完吗?
    我希望大家来讨论一下这样的情况,如果new操作符失败,系统会处在什么样的一种状态呢?
    对于new操作符失败的处理,怎样才有一个好的流程呢?
    在MFC7.0和.net虚拟机下,对new失败的处理用异常捕捉还是用判断空来处理呢?
    [/Quote]
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fish_kun
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-14 22:07:1822楼 得分:0
    顶taodm

    他说的正是我想问的!!1
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved