C++问题,关于内存分配和混合风格的基类问题
来源:百度知道 编辑:UC知道 时间:2024/06/19 00:55:33
template<class t> // 提供类set_new_handler支持的
class newhandlersupport { // 混合风格”的基类
public:
static new_handler set_new_handler(new_handler p);
static void * operator new(size_t size);
private:
static new_handler currenthandler;
};
template<class t>
new_handler newhandlersupport<t>::set_new_handler(new_handler p)
{
new_handler oldhandler = currenthandler;
currenthandler = p;
return oldhandler;
}
template<class t>
void * newhandlersupport<t>::operator new(size_t size)
{
new_handler globalhandler =
std::set_new_handler(currenthandler);
void *memory;
try {
memory = ::operator new(size);
}
catch (st
Effictive C++ Item 49吧这是......
std有一个set_new_handler函数,它接受和返回一个new_handler类型,用于设置当前当使用new操作符无法分配足够内存时而抛出bad_alloc异常的处理函数。
new_handler其实是一个void (void)函数,你可以在头文件<new>中看到它的typedef:
typedef void(*new_handler)();
所以std::set_new_handler其实是接受一个不接受参数也无返回值的函数的函数指针。而这个函数就被用来处理bad_alloc异常。
Scott Meyers这里要表达的意思是在类设计中如果涉及到对动态内存的分配和bad_alloc异常的处理,则你可以而且应该自定义自己对于特定类的bad_alloc异常处理函数,因为这有助于你发现是什么类型的对象内存分配未成功:
class Widget {
public:
static std::new_handler set_new_handler(std::new_handler p) throw();
static void * operator new(std::size_t size) throw(std::bad_alloc);
......
private:
static std::new_handler currentHandler;
};
当你有以下代码:
void OutMem()
{
......
}
// 把OutMem设置为Wigit类当前的bad_alloc处理函数
Wigit::set_new_handler(OutMem);
// 当内存分配失败时invoke OutMem
Wigit* pw1 = new Wigit;