C++问题,关于内存分配和混合风格的基类问题

来源:百度知道 编辑:UC知道 时间:2024/06/19 00:55:33
你只要创建一个“混合风格”(mixin-style)的基类,这种基类允许子类继承它某一特定的功能——这里指的是建立一个类的new-handler的功能。之所以设计一个基类,是为了让所有的子类可以继承set_new_handler和operator new功能,而设计模板是为了使每个子类有不同的currenthandler数据成员。这听起来很复杂,不过你会看到代码其实很熟悉。区别只不过是它现在可以被任何类重用了。

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;