博文

条款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......

阅读全文(2314) | 评论:0