C 分配内存失败怎么办

TOOCROWN 2013-06-07 10:00:00
buffer=(char *)malloc(256*sizeof(char));
if(buffer==NULL)
{
abort();

}

1.必需要检测内存分配失败吗?
2.如果分配失败,如何解决,一定是退出,或者返回吗?
3.如果是商业软件,不希望退出,返回,怎么办?
...全文
274 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-06-07
  • 打赏
  • 举报
回复
Q1.必需要检测内存分配失败吗? A1:Yes Q2.如果分配失败,如何解决,一定是退出,或者返回吗? A2:写日志到文件,将系统回滚到本次业务请求前状态。 Q3.如果是商业软件,不希望退出,返回,怎么办? A3:写日志到文件并设法(比如发邮件、发短信、发报警声、点亮报警灯、……)通知系统维护或开发人员,将系统回滚到本次业务请求前状态。
TOOCROWN 2013-06-07
  • 打赏
  • 举报
回复
但是有无一个确切的说法! 1.退出,商业应用程序就相当系统崩溃 2.返回 -1 ,是否下次调用还会出现分配错误 3.抛出异常,对这个异常到底怎么处理?
大尾巴猫 2013-06-07
  • 打赏
  • 举报
回复
我觉得内存耗尽了还是痛快的让程序退出。 内存都没了,还能干什么呀。
橡木疙瘩 2013-06-07
  • 打赏
  • 举报
回复
当前事务失败,所有操作回滚,记录日志信息,释放该事务中分配的所有资源。
startservice 2013-06-07
  • 打赏
  • 举报
回复
路过,帮顶。
TOOCROWN 2013-06-07
  • 打赏
  • 举报
回复
大型程序应该是不能退出 和终止程序? 大家用什么方法
大尾巴猫 2013-06-07
  • 打赏
  • 举报
回复
new失败直接抛出异常了,if (a == NULL)没机会执行的。
yshuise 2013-06-07
  • 打赏
  • 举报
回复
引用 3 楼 ZLhy_ 的回复:
7.9 内存耗尽怎么办? 如果在申请动态内存时找不到足够大的内存块,malloc和new将返回NULL指针,宣告内存申请失败。通常有三种方式处理“内存耗尽”问题。 (1)判断指针是否为NULL,如果是则马上用return语句终止本函数。例如: void Func(void) { A *a = new A; if(a == NULL) { return; } … } (2)判断指针是否为NULL,如果是则马上用exit(1)终止整个程序的运行。例如: void Func(void) { A *a = new A; if(a == NULL) { cout << “Memory Exhausted” << endl; exit(1); } … } (3)为new和malloc设置异常处理函数。例如Visual C++可以用_set_new_hander函数为new设置用户自己定义的异常处理函数,也可以让malloc享用与new相同的异常处理函数。详细内容请参考C++使用手册。 上述(1)(2)方式使用最普遍。如果一个函数内有多处需要申请动态内存,那么方式(1)就显得力不从心(释放内存很麻烦),应该用方式(2)来处理。 很多人不忍心用exit(1),问:“不编写出错处理程序,让操作系统自己解决行不行?” 不行。如果发生“内存耗尽”这样的事情,一般说来应用程序已经无药可救。如果不用exit(1) 把坏程序杀死,它可能会害死操作系统。道理如同:如果不把歹徒击毙,歹徒在老死之前会犯下更多的罪。 有一个很重要的现象要告诉大家。对于32位以上的应用程序而言,无论怎样使用malloc与new,几乎不可能导致“内存耗尽”。我在Windows 98下用Visual C++编写了测试程序,见示例7-9。这个程序会无休止地运行下去,根本不会终止。因为32位操作系统支持“虚存”,内存用完了,自动用硬盘空间顶替。我只听到硬盘嘎吱嘎吱地响,Window 98已经累得对键盘、鼠标毫无反应。 我可以得出这么一个结论:对于32位以上的应用程序,“内存耗尽”错误处理程序毫无用处。这下可把Unix和Windows程序员们乐坏了:反正错误处理程序不起作用,我就不写了,省了很多麻烦。 我不想误导读者,必须强调:不加错误处理将导致程序的质量很差,千万不可因小失大。 void main(void) { float *p = NULL; while(TRUE) { p = new float[1000000]; cout << “eat memory” << endl; if(p==NULL) exit(1); } }
new失败是抛出异常,不是为NULL
疯狂的红豆 2013-06-07
  • 打赏
  • 举报
回复
7.9 内存耗尽怎么办? 如果在申请动态内存时找不到足够大的内存块,malloc和new将返回NULL指针,宣告内存申请失败。通常有三种方式处理“内存耗尽”问题。 (1)判断指针是否为NULL,如果是则马上用return语句终止本函数。例如: void Func(void) { A *a = new A; if(a == NULL) { return; } … } (2)判断指针是否为NULL,如果是则马上用exit(1)终止整个程序的运行。例如: void Func(void) { A *a = new A; if(a == NULL) { cout << “Memory Exhausted” << endl; exit(1); } … } (3)为new和malloc设置异常处理函数。例如Visual C++可以用_set_new_hander函数为new设置用户自己定义的异常处理函数,也可以让malloc享用与new相同的异常处理函数。详细内容请参考C++使用手册。 上述(1)(2)方式使用最普遍。如果一个函数内有多处需要申请动态内存,那么方式(1)就显得力不从心(释放内存很麻烦),应该用方式(2)来处理。 很多人不忍心用exit(1),问:“不编写出错处理程序,让操作系统自己解决行不行?” 不行。如果发生“内存耗尽”这样的事情,一般说来应用程序已经无药可救。如果不用exit(1) 把坏程序杀死,它可能会害死操作系统。道理如同:如果不把歹徒击毙,歹徒在老死之前会犯下更多的罪。 有一个很重要的现象要告诉大家。对于32位以上的应用程序而言,无论怎样使用malloc与new,几乎不可能导致“内存耗尽”。我在Windows 98下用Visual C++编写了测试程序,见示例7-9。这个程序会无休止地运行下去,根本不会终止。因为32位操作系统支持“虚存”,内存用完了,自动用硬盘空间顶替。我只听到硬盘嘎吱嘎吱地响,Window 98已经累得对键盘、鼠标毫无反应。 我可以得出这么一个结论:对于32位以上的应用程序,“内存耗尽”错误处理程序毫无用处。这下可把Unix和Windows程序员们乐坏了:反正错误处理程序不起作用,我就不写了,省了很多麻烦。 我不想误导读者,必须强调:不加错误处理将导致程序的质量很差,千万不可因小失大。 void main(void) { float *p = NULL; while(TRUE) { p = new float[1000000]; cout << “eat memory” << endl; if(p==NULL) exit(1); } }
zilaishuichina 2013-06-07
  • 打赏
  • 举报
回复
嗯~~ 也不是不能继续往下执行 总之就是这个buffer在后面的代码中不可以使用
zilaishuichina 2013-06-07
  • 打赏
  • 举报
回复
1.必需要检测内存分配失败吗? 必须 2.如果分配失败,如何解决,一定是退出,或者返回吗? 看具体需求,不一定要退出,但肯定是不可以继续往下执行,可以当前逻辑不再做处理,打个LOG,抛个异常什么的,各种方法 3.如果是商业软件,不希望退出,返回,怎么办? 同2

64,649

社区成员

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

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