new内存失败处理

dkbrain 2010-12-02 10:14:14
小弟想自己写的程序中用了较多的new;但是new内存时会有失败的情况出现,请教下如何捕获这些异常
方法一是:
#include <new.h>

double *a = NULL;
a = new(std::nothrow) double[10000]; //编译时出现 identifier 'nothrow',但是nothrow这个常亮在new中明明是有的
if(!a)
AfxMessageBox(_T("内存分配失败!"));
else
……
方法二:
double *a;
try
{
a = new double[10000000];
}
catch(??) //catch里面应该捕获什么异常,具体应该怎么写,小弟对catch用法不是很了解。
{
AfxMessageBox(_T("内存分配失败!"));
}
delete a;
...全文
191 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
teleinfor 2010-12-04
  • 打赏
  • 举报
回复
new() 失败抛出的是一个bad_alloc类型的异常,不过没什么进一步的信息,就是显示bad allocation
try
{
....new()....
}
catch(bad_alloc& ba)
{
cout<<ba.what();
}
hsgzr 2010-12-04
  • 打赏
  • 举报
回复
try
{
……
}
catch(bad_alloc x){
……
}
使用此检查是否成功
微笑的鱼 2010-12-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 dkbrain 的回复:]

MFC中new失败后返回值不为空,而是抛出异常;
a = new(std::nothrow) double[10000]; 在release下编译就没有问题,
但是在debug下编译就会出现identifier 'nothrow'
请教下这是怎么回事?

引用 7 楼 gg606 的回复:
double *a = new double[10000000];
if (a == 0)……
[/Quote]

把下边这段代码删掉

#ifdef _DEBUG
#define new DEBUG_NEW
#endif
youhao1999 2010-12-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yqzhao_sx 的回复:]
还是看msdn好啊 , 可惜不是很懂英语,烦人~
[/Quote]
zgklem 2010-12-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dkbrain 的回复:]
try
{
……
}
catch
{
……
}
somecode

如果try中出现异常,并且catch有捕获到,那么catch之后的somecode代码会不会被执行,还是catch中代码执行完就直接结束了?
[/Quote]
只要catch里面没有跳转的话就会执行!
轮销桂魄@ 2010-12-03
  • 打赏
  • 举报
回复
double *a = new double[10000000];
if (a == NULL)
{
COUT<<"内存分配失败~"
}
dkbrain 2010-12-03
  • 打赏
  • 举报
回复
MFC中new失败后返回值不为空,而是抛出异常;
a = new(std::nothrow) double[10000]; 在release下编译就没有问题,
但是在debug下编译就会出现identifier 'nothrow'
请教下这是怎么回事?

[Quote=引用 7 楼 gg606 的回复:]
double *a = new double[10000000];
if (a == 0)
{
AfxMessageBox(_T("内存分配失败!"));
}
...
delete a;
[/Quote]
gg606 2010-12-02
  • 打赏
  • 举报
回复
double *a = new double[10000000];
if (a == 0)
{
AfxMessageBox(_T("内存分配失败!"));
}
...
delete a;
dkbrain 2010-12-02
  • 打赏
  • 举报
回复
try
{
……
}
catch
{
……
}
somecode

如果try中出现异常,并且catch有捕获到,那么catch之后的somecode代码会不会被执行,还是catch中代码执行完就直接结束了?
dkbrain 2010-12-02
  • 打赏
  • 举报
回复
方法一中的nothrow参数为什么编译的时候会出错?
在头文件上我有加
#include<new>
#include<iostream>

using namespace std;
mszjk 2010-12-02
  • 打赏
  • 举报
回复
不过new应该是不太会失败的.
mszjk 2010-12-02
  • 打赏
  • 举报
回复
sleep一下继续分配,我记得M$就是这么处理内存不够的.
yqzhao_sx 2010-12-02
  • 打赏
  • 举报
回复
还是看msdn好啊 , 可惜不是很懂英语,烦人~
m_tornado 2010-12-02
  • 打赏
  • 举报
回复
CMemoryException Out-of-memory exception

// exceptions_trycatchandthrowstatements.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
int main() {
char *buf;
try {
buf = new char[512];
if( buf == 0 )
throw "Memory allocation failure!";
}
catch( char * str ) {
cout << "Exception raised: " << str << '\n';
}
}

msdn里的例子

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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