C++的内存分配要检查失败吗?

9 篇文章 0 订阅
1 篇文章 0 订阅

转载:C++的内存分配要检查失败吗?  


看到这篇文章想到的:C++内存管理详解


原文中有这么一段:
* 内存分配未成功,却使用了它。

编程新手经常犯这种错误,因为他们没有意识到内存分配会不成功。常用解决办法是,在使用内存之前检查指针是否为NULL。如果指针p是函数的参数,那么在函数的入口处用assert(p!=NULL)进行

检查。如果是用malloc或new来申请内存,应该用if(p==NULL) 或if(p!=NULL)进行防错处理。

对于这个,我倒是有不同的看法。
一般来说,除非做作业,否则进行任何调用都应该检查是否成功,对调用失败进行适当的处理。但是(请原谅我总是说“但是”),内存分配与其它的调用不一样,很不一样。考虑代码:
char* p = new char[10000]; // 行 1
if(!p) // 行 2
abort(0); // 行 3

第一个疑问:行 1 的调用有可能返回 null 吗?
首先是 C++ 的标准符合问题,在这里,标准 C++ 是不会返回 null 的,只会抛出异常。当然,几乎所有的编译器都会有个编译器参数,允许这里不抛出异常。
其次是操作系统的问题,在这种情况下,绝大多数主流的操作系统如 Windows、Linux 是肯定不会返回 NULL 的。因为这个内存空间要求并不大,在“虚拟内存”技术大行其道的今天,操作系统绝对会说“我顶”,确实很紧张的话操作系统会说“我晕”然后发生“震荡”(即在内存与交换内存之间摇摆,性能极度下降,近乎死机),哪怕确实搞不定了操作系统只会说“我倒”然后死机,反正绝对不会返回一个NULL给善良的程序员……这是“虚拟内存”技术对内存分配的影响;还有一种技术,这个在Linux下用得多,就是“懒算法”,也就是说,不管你要多少内存,操作系统反正先答应你再说,这么一来,new 操作总是会被满足。我甚至试过在物理内存只有256M的 linux 下要求分配2G内存,操作系统毫不迟疑的返回了一个指针值给我!直到你要操作这块内存的时候,操作系统才明白过来,原来它搞不定,然后就会搞一个 core dump,但是,那与我们分配内存已经不在一个地方了……
第二个疑问:行3这个地方我们还有别的处理方法吗?
进行错误处理的前提是:我们有适当的处理方法。实际上,除了嵌入式设备实时应用等少数场合(应该注意的是,这种场合本来就不应该用堆),对于内存不足,我们只有一个处理方法,就是:abort。可是这本来就是系统默认的处理方式,我为什么要自己写一个呢?难道您还有更好的处理方式吗?

所以,对于 new ,我从来不看它的返回值,也不捕捉它的异常,因为那既无必要,也得不到你想的结果。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值