c++ new
2015-11-24 20:06
483 查看
在c代码中经常会见到这样的代码
[cpp]
view plaincopyprint?
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
char * str=(char *)malloc(100*sizeof(char));
if (str==NULL)
{
//错误处理
}
出于习惯的问题,在C++中也中也这么写
[cpp]
view plaincopyprint?
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
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?
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
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
![](http://img.blog.csdn.net/20140331105950531)
@2:进行异常处理:
[cpp]
view plaincopyprint?
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
#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;
}
[cpp]
view plaincopyprint?
![](https://code.csdn.net/assets/CODE_ico.png)
char * str=(char *)malloc(100*sizeof(char));
if (str==NULL)
{
//错误处理
}
char * str=(char *)malloc(100*sizeof(char)); if (str==NULL) { //错误处理 }
出于习惯的问题,在C++中也中也这么写
[cpp]
view plaincopyprint?
![](https://code.csdn.net/assets/CODE_ico.png)
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?
![](https://code.csdn.net/assets/CODE_ico.png)
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?
![](https://code.csdn.net/assets/CODE_ico.png)
#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;
}
相关文章推荐
- Partition List | LeetCode 8ms C++Solution
- 基于Huffman树的文件压缩原理及C语言实现(二)
- A.挑战密室
- C++ Primer 学习笔记——函数(二)
- C++指针的引用理解
- C++ socket编程
- C语言函数堆栈的思考
- C++静态分析工具
- C++ 文件里面调用C文件里面的函数——extern "C" 用法解析
- C++标准库Vector & Iterator
- C语言中快速排序和插入排序优化的实现
- 【C语言】【指针相关知识小结】
- C++primer plus第六版课后编程练习答案3.7
- C语言实现链表之双向链表(十五)测试用例
- C语言实现链表之双向链表(十四)链表打印
- C语言实现链表之双向链表(十三)获取数据对应的结点
- C语言实现链表之双向链表(十二)判断链表是否为空和获取链表长度
- C++屏蔽Windows中文输入法
- C++primer plus第六版课后编程练习答案3.5
- C语言实现链表之双向链表(十一)设置结点数据与获取结点数据