SGI-STL分配器内部函数_s_om_malloc的设计



代码如下:

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
  • )
  • 抛出异常
  • abortexit

其次,它使用C库的malloc来分配空间的原因是malloc在大多数系统上是一个经过良好测试且有效实现的函数。标准库的new函数"简单地"是异常安全和类型安全的包装(如果您想要,您作为用户也可以覆盖它)。

相关内容

  • 没有找到相关文章

最新更新