【发布时间】:2013-09-22 15:34:02
【问题描述】:
new-handler 函数是分配函数在内存分配尝试失败时调用的函数。其预期目的是以下三件事之一:
- 提供更多可用内存
- 终止程序(例如通过调用 std::terminate)
- 抛出 std::bad_alloc 类型的异常或从 std::bad_alloc 派生的异常
下面的重载能保证什么吗?
void * operator new(std::size_t size) throw(std::bad_alloc){
while(true) {
void* pMem = malloc(size);
if(pMem)
return pMem;
std::new_handler Handler = std::set_new_handler(0);
std::set_new_handler(Handler);
if(Handler)
(*Handler)();
else
throw bad_alloc();
}
}
【问题讨论】:
-
您的问题是什么? “保证任何东西”是什么意思?
-
@JonathanWakely,我不应该使用“保证”这个词。我的意思是:使用这种重载方法可以通过任何方式增加成功分配的机会吗?
-
@n.m. “魔法”在什么背景下?
-
发布的实现将调用当前的新处理程序(如果已设置),因此新处理程序可以尝试释放一些内存并抛出
std::bad_alloc,调用者可以捕获它并重试new电话。其工作方式(以及是否)完全取决于应用程序,并且仅在非常特殊的情况下才需要。在大多数应用程序中,要么不担心分配失败,要么捕获bad_alloc并优雅地退出。 -
对不起,我误读了这个问题。此重载或多或少是标准
operator new的忠实实现,因此,它不保证超出标准operator new所保证的任何内容。