对于类特定的 new_handler 实现,我在“effective c++”一书中遇到了以下示例。这在多线程环境中看起来有问题,我的问题是如何在多线程环境中实现类特定的 new_handler?
void * X::operator new(size_t size)
{
new_handler globalHandler = // install X's
std::set_new_handler(currentHandler); // handler
void *memory;
try { // attempt
memory = ::operator new(size); // allocation
}
catch (std::bad_alloc&) { // restore
std::set_new_handler(globalHandler); // handler;
throw; // propagate
} // exception
std::set_new_handler(globalHandler); // restore
// handler
return memory;
}
最佳答案
你是对的。这可能不是线程安全的。您可能需要考虑一种替代方法,例如使用 nothrow
version of new
相反:
void* X::operator new(std::size_t sz) {
void *p;
while ((p = ::operator new(sz, std::nothrow) == NULL) {
X::new_handler();
}
return p;
}
这将导致您的特定于类的处理程序在内存分配失败时被调用。在您真正了解重载 operator new
的所有令人头疼的问题之前,我不会这样做。特别是,阅读 Herb Sutter 的两部分文章 To New, Perchance To Throw,Part 1和 Part 2 。有趣的是,他说要避免 nothrow
版本……嗯。
关于c++ - 使用类特定的 set_new_handler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1332015/