代码如下:
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_oom_malloc使用无限循环? 2.正如我们所知,当malloc在__malloc_alloc_template :: allocate函数中失败时,将调用_S_oom_malloc。为什么它使用malloc来分配空间?
任何人都可以帮助我吗?非常感谢。
答案 0 :(得分:0)
首先,循环并非真正无限。有两个出口:通过分配所请求的内存量来抛出BAD_ALLOC
异常。当前new-handler是空指针时,将抛出异常。
要了解如何发生这种情况,请参考,例如来自Effective C++的第49项。基本上任何新的处理程序都可以
set_new_handler
abort
或exit
其次,它使用C库的malloc
来分配空间的原因是大多数系统上malloc
是经过充分测试和有效实现的功能。标准图书馆的new
功能仅仅是#34;&#34;围绕它的异常安全和类型安全的包装器(如果你想要的话,你作为用户也可以覆盖它)。