C/C++误区五:检查 new 的返回值

首先澄清一下,这个误区仅对 C++ 成立,这里不过是沿用“C/C++ 误区”这个衔头罢了。

我们都知道,使用 malloc/calloc 等分配内存的函数时,一定要检查其返回值是否为“空指针”(亦即检查分配内存的操作是否成功),这是良好的编程习惯,也是编写可靠程序所必需的。但是,如果你简单地把这一招应用到 new 上,那可就不一定正确了。我经常看到类似这样的代码:

int* p = new int[SIZE];
if ( p == 0 ) // 检查 p 是否空指针
return -1;
// 其它代码

其实,这里的 if ( p == 0 ) 完全是没啥意义的。C++ 里,如果 new 分配内存失败,默认是抛出异常的。所以,如果分配成功,p == 0 就绝对不会成立;而如果分配失败了,也不会执行 if ( p == 0 ),因为分配失败时,new 就会抛出异常跳过后面的代码。如果你想检查 new 是否成功,应该捕捉异常:

try {
int* p = new int[SIZE];
// 其它代码
} catch ( const bad_alloc& e ) {
return -1;
}

据说一些老的编译器里,new 如果分配内存失败,是不抛出异常的(大概是因为那时 C++ 还没加入异常机制),而是和 malloc 一样,返回空指针。不过我从来都没遇到过 new 返回空指针的情况。

当然,标准 C++ 亦提供了一个方法来抑制 new 抛出异常,而返回空指针:

int* p = new (std::nothrow) int; // 这样如果 new 失败了,就不会抛出异常,而是返回空指针
if ( p == 0 ) // 如此这般,这个判断就有意义了
return -1;
// 其它代码

时间: 2024-10-04 10:10:34

C/C++误区五:检查 new 的返回值的相关文章

【整理】为什么在C/C++中总是对malloc的返回值进行强制转换

============= 文章1 ================         首先要说的是,使用 malloc 函数,请包含 stdlib.h(C++ 中可以是 cstdlib),而不是 malloc.h .因为 malloc.h 从来没有在 C 或者 C++ 标准中出现过!因此并非所有编译器都有 malloc.h 这个头文件.但是所有的 C 编译器都应该有 stdlib.h 这个头文件.   在 C++ 中,强制转换 malloc() 的返回值是必须的,否则不能通过编译. 在 C 中,

c++函数返回值是数组问题

问题描述 c++函数返回值是数组问题 比如现在要求定义一个函数fun(),在主函数调用时直接用fun():就能输出在fun函数里定义好的一个字符串,那要fun函数的返回值怎么返回才行,为什么我返回指针但打印出来却不是正确结果?求大神解释 解决方案 一般来说,出于内存管理的需要,让主程序来分配内存,传指针.比如scanf函数,就是通过这个方式输入值. 比如 void getstr(char * buffer) { char str[] = "hello world"; strcpy(bu

函数返回值的检查方法----历史遗留问题?

问题描述 网上众多的源码,在创建事件或者创建线程之后,会将其句柄与INVALID_HANDLE_VALUE进行比较,检查函数的执行是否成功,如下所示:m_hExitEvt=CreateEvent(NULL,FALSE,FALSE,NULL);if(m_hExitEvt==INVALID_HANDLE_VALUE){returnFALSE;}问题出现了:在d:ProgramFilesMicrosoftVisualStudio.NET2003vc7PlatformSDKincludepdh.h和d:

《设计的方法》—第6课误区五:才华非常重要

误区五:才华非常重要设计的方法赞扬的话语令人身心愉悦:父母告诉你,你是他们的骄傲:导师在你作品中看到了希望:老板说你超出了他的预期.赞美.喝彩和认可的内在冲击让你不遗余力地翻越一座又一座高峰.难怪你愿意不断地尝试超越自己. 渴望设计出伟大的作品并非是不良的品质,但问题在于在设计中追求卓越可能不合时宜.大胆的创意令人兴奋,简单的想法差强人意,矛盾由此产生.然而,优秀而持久的设计往往倾向于后一个阵营. 我爱上了被灵感击中的感觉,它如此"令人振奋"(然而,脑袋上却烙上了印记)你需要考虑你在作

ASP.NET MVC 重点教程一周年版 第五回 ActionResult的其它返回值

我们上边所看到的Action都是return View();我们可以看作这个返回值用于解析一个aspx文件.而它的返回类型是ActionResult如 public ActionResult Index() { return View(); } 除了View()之外那我们这里还能用于返回什么值呢? 一.ascx页面 场景:要返回代码片断,比如Ajax返回一个子页 我们先新建一个Action public ActionResult Ascx() { return PartialView(); }

C/C++误区三:强制转换 malloc() 的返回值

首先要说的是,使用 malloc 函数,请包含 stdlib.h(C++ 中是 cstdlib) ,而不是 malloc.h .因为 malloc.h 从来没有在 C 或者 C++ 标准中出现过! 因此并非所有编译器都有 malloc.h 这个头文件.但是所有的 C 编译器都应该 有 stdlib.h 这个头文件. 在 C++ 中,强制转换 malloc() 的返回值 是必须的,否则不能通过编译.但是在 C 中,这种强制转换却是多余的,并且 不利于代码维护. 起初,C 没有 void 指针,那时

ASP.NET MVC重点教程一周年版 第五回 ActionResult的其它返回值

我们上边所看到的Action都是return View();我们可以看作这个返回值用于解析一个aspx文件 .而它的返回类型是ActionResult如 public ActionResult Index() { return View(); } 除了View()之外那我们这里还能用于返回什么值呢? 一.ascx页面 场景:要返回代码片断,比如Ajax返回一个子页 我们先新建 一个Action public ActionResult Ascx() { return PartialView ();

数据库无返回值错误

问题描述 DimAccessConnAsNewOleDb.OleDbConnection(AccessConnectionString)'建立链接AccessConn.Open()'打开数据库Fora=1ToListView1.Items.CountDimAccessStringAsString="INSERTINTO入库单(日期,班级,规格,半品,成品,总件数,隔纸,种类,克重,产量,吨位)VALUES('"&_ListView1.Items.Item(a-1).Text&a

ajax返回值

问题描述 我想用ajax执行完servlet检查服务器文件是否文件后,得到返回值,请各位高手执教. 解决方案 解决方案二:serlet:response.getWriter().println("1");js:functioncollection(href){varurl="http://...";varmyAjax=newAjax.Request(//这个是phototype的Ajax url, { method:'get', onComplete:showRes