众所周知:C++的new运算符(这里特指无参数版本)在分配内存失败时会抛出std::bad_alloc异常。但有时程序员不希望抛出异常,因此C++给出了一个返回NULL的版本new(std::nothrow),用法大致如下:
#include<new>
int *p = 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) 编辑 收藏 引用 所属分类:
玩转编程