new操作符的异常处理函数失效
new操作符的错误处理函数失效
源码如下:
编译器是GCC 64位,为什么抛出了bad_alloc错误,却没有调用errorn函数呢??
应该怎么修改呢???
------解决思路----------------------
你故意绕了这么多弯干啥,名字还都取一样的。。。
40行在栈上分配的newHandler对象,std::set_new_handler在退出widget的operator new函数的时候才会被ht的析构函数调用,这时::operator new早就已经抛bad_alloc了
------解决思路----------------------
++
同意
析构函数执行得太晚了,应该在构造函数里调用 std::set_new_handler(current);
另外,这个封装完全是不必需的
源码如下:
#include <new>
#include <stdlib.h>
#include <iostream>
class newHandler
{
public:
newHandler(std::new_handler ogpf)
:current(ogpf) {}
~newHandler()
{
std::set_new_handler(current);
}
private:
std::new_handler current;
newHandler(const newHandler& copy);
newHandler& operator= (const newHandler ©);
};
class widget
{
public:
static std::new_handler set_new_handler(std::new_handler newhandler);
static void* operator new(std::size_t size) throw(std::bad_alloc);
private:
static std::new_handler savehandler;
};
std::new_handler widget::savehandler = NULL;
std::new_handler widget::set_new_handler(std::new_handler newhandler)
{
std::new_handler oldhandler = savehandler;
savehandler = newhandler;
return oldhandler;
}
void* widget::operator new(std::size_t size) throw(std::bad_alloc)
{
newHandler ht(set_new_handler(savehandler));
return (::operator new(size));
}
void errorn()
{
std::cerr<<"Too big\n"<<std::endl;
exit(0);
}
int main()
{
widget::set_new_handler(errorn);
widget *p = new widget[39000000000000000];
return 0;
}
编译器是GCC 64位,为什么抛出了bad_alloc错误,却没有调用errorn函数呢??
应该怎么修改呢???
------解决思路----------------------
你故意绕了这么多弯干啥,名字还都取一样的。。。
40行在栈上分配的newHandler对象,std::set_new_handler在退出widget的operator new函数的时候才会被ht的析构函数调用,这时::operator new早就已经抛bad_alloc了
------解决思路----------------------
++
同意
析构函数执行得太晚了,应该在构造函数里调用 std::set_new_handler(current);
另外,这个封装完全是不必需的