代码如下:
template <int __inst>
void*
__malloc_alloc_template<__inst>::_S_oom_malloc(size_t __n)
{
void (* __my_malloc_handler)();
void* __result;
for (;;) {
__my_malloc_handler = __malloc_alloc_oom_handler;
if (0 == __my_malloc_handler) { __THROW_BAD_ALLOC; }
(*__my_malloc_handler)();
__result = malloc(__n);
if (__result) return(__result);
}
}
我有两个问题。1. 为什么_s_ooom_malloc使用无限循环?2. 正如我们所知,在__malloc_alloc_template::allocate函数中,当malloc失败时,将调用_s_ooom_malloc。为什么它使用malloc来分配空间?
有人能帮我吗?非常感谢。
首先,循环并不是真正无限的。有两种退出方式:抛出一个BAD_ALLOC
异常,或者分配所请求的内存量。当当前的new-handler为空指针时,将抛出异常。
要了解这是如何发生的,请参考Effective c++中的第49项。基本上,任何new-handler都可以
- 提供更多可用内存
- 安装不同的new-handler
- 卸载new-handler(即传递一个空指针给
set_new_handler
) - 抛出异常
-
abort
或exit
其次,它使用C库的malloc
来分配空间的原因是malloc
在大多数系统上是一个经过良好测试且有效实现的函数。标准库的new
函数"简单地"是异常安全和类型安全的包装(如果您想要,您作为用户也可以覆盖它)。