博文
条款7:预先准备好内存不够的情况(2008-10-15 19:25:00)
摘要:采用new分配内存,必须对内存分配失败时做好准备。
在内存分配之前,我们可以预先指定一个出错函数:
typedef void (*new_handle)()
set_new_handler(new_handler p) throw();
可以看到,new_handler是一个自定义的函数指针类型,它指向一个没有输入参数也没有返回值的函数。set_new_handler的输入参数是operator new分配内存失败时要调用的出错处理函数的指针,返回值是set_new_handler没调用之前就已经在起作用的旧的出错处理函数的指针。
可以象下面这样使用set_new_handler:
// function to call if operator new can't allocate enough memory
void nomorememory()
{
cerr << "unable to satisfy request for memory\n";
abort();
}
int main()
{
set_new_handler(nomorememory);
int *pbigdataarray = new int[100000000];
...
}我们可以对每个类重载new,并且提供set_new_handler函数。以下是这种形式:class x {
public:
static new_handler set_new_handler(new_handler p);
static void * operator new(size_t size);
private:
static new_handler currenthandler;
};
new_handler x::set_new_handler(new_handler p)
{
new_handler oldhandler = currenthandler;
currenthandler = p;
return oldhandler;
}
void * x::operator new(size_t size)
{
new_handler globalhandler......