C++ new运算符误用之详解

来源:互联网 发布:出国旅游英语翻译软件 编辑:程序博客网 时间:2024/05/22 05:09

1. plain new/delete:

普通的new 定义如下:

void *operator new(std::size_t) throw(std::bad_alloc);

void operator delete(void*) throw();

注意:标准C++ plain new 失败后抛出标准异常std::bad_alloc而非返回NULL,因此检查返回值是否为NULL判断分配内存空间是没有意义的

普通new申请空间示例代码:


#include <iostream>using namespace std;typedef unsigned long ULONGS;char *GetMemory(ULONGS size);int main(){try{ULONGS ulSize(10e11);char *pMem=GetMemory(ulSize);if(NULL == pMem){cout<<"Alloc Memory failure!"<<endl;}delete [] pMem;pMem = NULL;}catch(const std::bad_alloc &ex){cout<<ex.what()<<endl;}return 0;}char *GetMemory(ULONGS size){char * pMem = new char[size];//分配失败,指针不为空if(NULL == pMem){cout<<"Alloc Memory failure!"<<endl;}return pMem;}

这段代码运行出来结果如下图所示:



代码抛出申请申请空间异常的信息



2.nothrow new/delete:


不抛出异常的运算符new的形式,new失败时返回NULL定义如下:
void *operator new(std::size_t,const std::nothrow_t&) throw();

void operator delete(void*) throw();

struct nothrow_t{}; const nothrow_t nothrow;//nothrow作为new的标志性

将上面的代码中申请内存空间函数稍作如下修改,其余函数调用都不变

char *GetMemory(ULONGS size){char * pMem = new(nothrow) char[size];//分配失败,指针为空if(NULL == pMem){cout<<"Alloc Memory failure!"<<endl;}return pMem;}

运行该段程序,则运行结果显示申请空间失败后指针为空,运行结果如下所示:






0 0