posts - 267,  comments - 1129,  trackbacks - 0
众所周知:C++的new运算符(这里特指无参数版本)在分配内存失败时会抛出std::bad_alloc异常。但有时程序员不希望抛出异常,因此C++给出了一个返回NULL的版本new(std::nothrow),用法大致如下:
#include<new>
int *= new(std::nothrow) int;
int *parr = new(std::nothrow) int[5];
这样,C++将分别调用这两个函数:
//declared in <new>
void* operator new(std::size_t, const std::nothrow_t&throw();
void* operator new[](std::size_t, const std::nothrow_t&throw();
从后面的throw列表可以看出,这两个函数是保证不抛出任何异常的。
但是,当我们要把指针delete掉时,应该怎样写呢?<<effective C++>>第10条款教导我们:应该调用对应版本的new和delete。而事实上<new>也声明了这两个函数:
void operator delete(void*const std::nothrow_t&throw();
void operator delete[](void*const std::nothrow_t&throw();
可是如果你真的这么写:
delete(std::nothrow) p;
delete(std::nothrow)[] parr;
编译器就会跟你过不去了。我的编译器(g++ (GCC) 4.2.3 (Ubuntu 4.2.3-2ubuntu7))会这么说:
错误: ‘delete’的参数类型应为指针而非‘const struct std::nothrow_t’
很显然,它把我的delete语句当成了普通的 delete了,因此只能够这样写:
delete p;
delete[] parr;
当然,这样做其实是安全的(假如你没有重定义了这几坨运算符并赋予它一个奇怪的行为的话),因为operator delete(void*)和operator delete[](void*)的throw列表也是空的。但这样,是否缺乏了一些编程上的美感呢?

PS: 经过测试,发现不光是这个nothrow的delete,连placement delete也是调用不了的。
posted on 2008-07-26 17:56 踏雪赤兔 阅读(313) 评论(0)  编辑 收藏 引用 所属分类: 玩转编程


标题  
姓名  
主页
验证码 *
内容(提交失败后,可以通过“恢复上次提交”恢复刚刚提交的内容)
 
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
[使用Ctrl+Enter键可以直接提交]
 
相关链接:




百度空间| 见闻日记| 编程感悟
我的twitter


LOGO

自我介绍:我系鸣仔,喜爱研究算法,曾是中大ACM队员。 发QQ消息


添加到收藏夹 Locations of visitors to this page

常用链接

随笔分类(290)

随笔档案(267)

文章分类(38)

相册

收藏夹(54)

与博主互动

博客手拉手

搜索

  •  

积分与排名

  • 积分 - 131909
  • 排名 - 5

最新评论

阅读排行榜

评论排行榜

60天内阅读排行