您的位置:首页 > 编程语言 > C语言/C++

c++ new

2015-11-24 20:06 483 查看
在c代码中经常会见到这样的代码

[cpp]
view plaincopyprint?





char * str=(char *)malloc(100*sizeof(char));

if (str==NULL)
{
//错误处理

}

char * str=(char *)malloc(100*sizeof(char));
if (str==NULL)
{
//错误处理

}


出于习惯的问题,在C++中也中也这么写

[cpp]
view plaincopyprint?





m_pToolBarDlg=new CDYToolBarDlg();

if (m_pToolBarDlg==NULL)

{
StringCchPrintf(szMsg,128,_T("new CDYToolBarDlg() failed in %s File at %d line "),_T(__FILE__),__LINE__);

MessageBox(szMsg,_T("Error"));

return -1;
}

m_pToolBarDlg=new CDYToolBarDlg();
if (m_pToolBarDlg==NULL)
{
StringCchPrintf(szMsg,128,_T("new CDYToolBarDlg() failed in %s File at %d line "),_T(__FILE__),__LINE__);
MessageBox(szMsg,_T("Error"));
return -1;
}


这犯了一个极大的错误,因为在Visual C++ 6.0之后,new失败时候抛出一个异常(std::bad_alloc),而不是返回一个空指针。要解决这个问题有两种方式,一种是禁止抛出异常,一种是进行异常处理。禁止抛出异常又有两种方式。

@1:禁止抛出异常

@1.1 :用new (std::nothrow) T代替以前的new

[cpp]
view plaincopyprint?





m_pToolBarDlg=new(std::nothrow) CDYToolBarDlg();

if (m_pToolBarDlg==NULL)
{
StringCchPrintf(szMsg,128,_T("new CDYToolBarDlg() failed in %s File at %d line "),_T(__FILE__),__LINE__);

MessageBox(szMsg,_T("Error"));

return -1;
}

m_pToolBarDlg=new(std::nothrow) CDYToolBarDlg();
if (m_pToolBarDlg==NULL)
{
StringCchPrintf(szMsg,128,_T("new CDYToolBarDlg() failed in %s File at %d line "),_T(__FILE__),__LINE__);
MessageBox(szMsg,_T("Error"));
return -1;
}


@1.2:项目链接到nothrownew.obj



@2:进行异常处理:

[cpp]
view plaincopyprint?





#include <new>

try
{
m_pToolBarDlg=new CDYToolBarDlg();

}
catch (const std::bad_alloc &)

{
StringCchPrintf(szMsg,128,_T("new CDYToolBarDlg() failed in %s File at %d line "),_T(__FILE__),__LINE__);

MessageBox(szMsg,_T("Error"));

return -1;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: