大家都怎样处理申请内存失败的问题?

dragonwind 2005-01-13 04:26:28
C/C++中最常用的操作就是:
Item * itm = (Item*) malloc(sizeof(Item));
或者
Item * itm = new Item("item 1");

如果申请内存失败,大家都怎么处理?最好能根据自己程序的运行环境说一说看法。

我所在的项目是基于嵌入式linux中,好多代码中是没有处理这种错误的,一般情况下如果申请失败会造成segment fault。但是我做的模块是公共运行库,不处理是可能影响很多模块的。但是处理起来很头疼。比如需要初始化一个链表,但没有足够的内存,怎么办?
...全文
1893 20 打赏 收藏 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
hongjun_han 2005-01-14
  • 打赏
  • 举报
回复
void *realloc(void *block, size_t size) 可以用这个,
要不行,就退出呗。
zhangfjj 2005-01-14
  • 打赏
  • 举报
回复
看异常处理,那里不是专门讲了吗?
dragonwind 2005-01-14
  • 打赏
  • 举报
回复
实现当然容易实现,但是必须修改其他模块和此模块之间的接口,这并不容易。
piaozi2003 2005-01-14
  • 打赏
  • 举报
回复
感觉第三条还是最好做的,返回一个枚举变量,就象errno那样,不是很清楚嘛!
dragonwind 2005-01-14
  • 打赏
  • 举报
回复
总结一下:申请内存失败,如果没有其他备用方案,当前模块应该保证以下几点:
1。 尽量释放已经占用的内存
2。 给当前模块所使用的数据赋上初始值,比如置零,保证不会有类似悬挂指针的数据
3。 设置标志表示自己不可用,给调用者提供一个接口表示自己不可用

最难做到的应该是第三条了,如果系统从头设计,当然可以让其他程序在调用此模块之前检查是否可用。但实际上做起来很不容易,特别是做一个新模块来替换旧的模块,接口必须保持不变。
sandrowjw 2005-01-14
  • 打赏
  • 举报
回复
如果用了RAII的话会好一些(已经获得的资源的释放比较简单),还有就是注意用临时变量,初始化和释放以后把指针置零(智能指针就没关系了)。
一般有界面的程序里我不会直接退出的。console的话么就不管那么多了。
yjh1982 2005-01-14
  • 打赏
  • 举报
回复
say bye bye
idler 2005-01-14
  • 打赏
  • 举报
回复
工控的东西的话,事关安全一般就刹车然后退出程序
别的应用的话,退出就可以了
dragonwind 2005-01-14
  • 打赏
  • 举报
回复
piaozi2003的话很有道理,谢谢。

单纯从一个模块来考虑,应该尽量考虑内存分配中可能出现的各种情况。同时也说明了那些依赖于动态内存分配的算法的健壮性是很难保证。

而各种内存使用方法也都是各有优缺点,比如预先分配大块内存和使用定长缓冲区,在处理少量数据的时候会造成浪费,而这种浪费在嵌入式系统中几乎是无法容忍的。
Flood1984 2005-01-14
  • 打赏
  • 举报
回复
WHILE循环当然不太好,假如需求的内存太大,已经超出当前系统总内存,那就不可能申请成功,必定导致死循环。
goodluckyxl 2005-01-14
  • 打赏
  • 举报
回复
可以通过返回来进行分配结果的处理
给用户返回ALLOCATE_ERROR 的 FLAG
piaozi2003 2005-01-14
  • 打赏
  • 举报
回复
我的个人感觉:

1. 再使用realloc时,绝对不使用p=realloc(p,newsize)的这种形式,一旦分配失败,p原来的指向也丢了,所以一定在这里使用备用指针,通过检查备用指针的返回值再确定是否将p也指向新分配的区域。
如: temp=realloc(p.newsize);
if(temp) p=temp;

2. 在程序中的一个模块中分配内存失败,大多要把该模块中分配的其他内存都释放掉。

比如一个动态二维数组 a[10][10],当a[0]-a[8]的指向的各个数组都成功,但是a[9]指向的内存
分配失败,则在函数返回时把a[0]-a[8]成功分配的内存也都删除掉,再删除a指向的内存,原因很简单,我不能返回一个部分正确,部分错误的内存区域。在整个程序还在运行的情况下,我要确保别的程序能获得清晰的信息!

一些资料也提供了相关意见:
1 分解内存需求 :也就是分配一个大块失败,则可以尝试分配两个小块
2 当需要一个动态调整的缓冲区时,一开始分配一个大的多的内存很有意义!(比如说估计需要的内存的一倍)可以减少以后
realloc的分配次数,从而减少碎片,提高性能!
3 分配应急保留区
4 使用磁盘空间[利用虚拟内存]
5 在确定的情况下,使用定长缓冲区,减少使用动态缓冲区的次数!
Kshape 2005-01-14
  • 打赏
  • 举报
回复
捕捉异常
重新申请
或者退出程序
dragonwind 2005-01-13
  • 打赏
  • 举报
回复
怎么再就没人说了呢?有哪位大侠指点一下?
dragonwind 2005-01-13
  • 打赏
  • 举报
回复
to: cnepine(奔)
谢谢你的提醒。

我还没有运行程序呢,我是在实现一个solution的时候做代码来证明可行性,然后突然想到这个问题。而且我正在整理一篇关于异常处理的文章,所以想听听大家的意见。

当然这种情况比较特殊,如果真正发生了内存不足,那么系统已经处于崩溃的边缘,系统的行为已经和我们的期望不同,除了我的模块,其他模块也可能发生这个问题。

我自己的想法是这个模块存在和其他模块的契约,如果申请内存失败,我可以设置标志,表示我这个模块无法完成工作,但是我还是很难控制系统的行为,因为到目前为止并不存在一个统一的原则来规定临界状态下系统的行为。
cnepine 2005-01-13
  • 打赏
  • 举报
回复
Item * itm = (Item*) malloc(sizeof(Item));
申请内存失败,可能不是这行代码的问题。有可能是程序的其它地方发生了异常,导致了这行代码发生了问题,你再通观一下整个程序的流程。单步跟踪一下看看。
seabreeze9802 2005-01-13
  • 打赏
  • 举报
回复
还没遇到这么严格的情况

我想不够的话,那就用while循环不停申请咯,直到申请成功为止

如while((itm = (Item*) malloc(sizeof(Item))!=NULL){...}
CMyMfc 2005-01-13
  • 打赏
  • 举报
回复
顶, 做的东西不多, 不过都是退出程序
suyouxin 2005-01-13
  • 打赏
  • 举报
回复
一般就是直接退出程序

以前看见过一本书上说程序一开始可以申请一个大块内存,
当以后失败的时候再释放这个内存,再重新申请。也许这个也是一个办法
beyondtkl 2005-01-13
  • 打赏
  • 举报
回复
失敗。。
偶一般就退出程序吧。。當然會寫到日志裡去。。。

樓主這個問題不錯 gz..
内容概要:本文围绕“数据驱动下光伏建筑群源荷不确定性解析及其储能多目标低碳经济调度研究”展开,提出了一种融合数据驱动方法与多目标优化算法的综合调度框架。研究首先基于历史数据对光伏发电出力与建筑负荷的不确定性进行建模,采用概率预测与场景生成技术刻画源荷波动特性,并通过典型场景提取降低输入复杂性。在此基础上,构建了以最小化系统运行成本、降低碳排放强度、提升可再生能源消纳率为目标的多目标优化模型,引入NSGA-II等先进智能优化算法求解Pareto最优前沿,实现经济性与低碳性的协同优化。通过Python编程完成模型搭建与仿真验证,结果表明该方法能有效应对源荷双重不确定性,在保障供电可靠性的前提下,实现了储能系统的优化配置与多目标调度决策的均衡协调; 适合人群:具备一定电力系统基础知识和Python编程能力,从事能源系统优化、智能调度、低碳技术等相关领域的研究生、科研人员及工程技术人员; 使用场景及目标:①应用于光伏建筑群、工业园区微电网等分布式能源系统的运行调度;②支撑含储能系统的多目标低碳经济调度决策,兼顾能源成本节约与碳排放控制双重目标;③为相关课题的研究与工程实践提供完整的算法实现参考与可复现的仿真案例支持; 阅读建议:建议读者结合文中提供的Python代码深入理解模型构建与求解流程,重点关注不确定性建模与多目标优化的耦合机制,可在实际数据基础上复现并改进算法,进一步探索不同权重策略下的调度方案优选方法。
代码下载链接: https://pan.quark.cn/s/cd4149768c91 互联网灰度部署系统解决方案的核心内容深度阐释: 一、灰度发布概念 灰度发布(亦称金丝雀发布)是在云计算及互联网服务领域中常见的一种发布策略,其中心理念是在全面推广新版本前,先向部分用户群体开放试用,以此来降低更新过程中的潜在风险。这种发布模式能够有效地兼顾用户体验与系统稳定性,它允许企业逐步将新的代码或功能部署至生产环境,并且仅对部分用户群体可见。此种做法有助于提前识别潜在问题,对用户体验造成的影响较小,并且能够获取更为真实的用户反馈信息。 二、系统现状和建设背景 在传统的发布模式中,每次更新都需要暂停服务才能发布新版本,这在用户体验和服务连续性方面存在明显不足。伴随互联网经济的繁荣发展,移动终端与日常生活的融合日益紧密,对互联网系统的支撑需求持续增长。特别是在电信行业,系统需要实现7*24小时不间断服务,以适应快速变化的市场需求和频繁更新的技术。因此,迫切需要一种新的发布方式,即灰度发布,用以提升产品发布的效率并改善用户体验。 三、灰度发布的优势与挑战 灰度发布相较于传统全量发布的优势包括: 1. 提供了新功能的试错空间,支持边发布边进行优化。 2. 维持服务的连续性,实现无缝升级。 3. 针对不同用户群体实施功能区分,提升用户体验和满意度。 4. 收集用户反馈,为后续版本的功能迭代和优化提供指导。 然而,灰度发布同样面临挑战,例如技术实现的复杂性、增加的运维压力等。 四、灰度发布的具体实施策略 1. 建设目标:保证湖北联通对外服务的互联网程序能够实现7*24小时不中断的灰度发布,实现无缝升级,同时全面提升用户体验。 2. 总体说明:需要通过灰度发布实现迭代开发和版本快速更...

65,213

社区成员

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

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