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

时间:2013-05-15 02:33:53

标签: stl allocator sgi

代码如下:

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来分配空间?

任何人都可以帮助我吗?非常感谢。

1 个答案:

答案 0 :(得分:0)

首先,循环并非真正无限。有两个出口:通过分配所请求的内存量来抛出BAD_ALLOC异常。当前new-handler是空指针时,将抛出异常。

要了解如何发生这种情况,请参考,例如来自Effective C++的第49项。基本上任何新的处理程序都可以

  • 提供更多可用内存
  • 安装其他新处理程序
  • 卸载新处理程序(即将空指针传递给set_new_handler
  • 抛出异常
  • abortexit

其次,它使用C库的malloc来分配空间的原因是大多数系统上malloc是经过充分测试和有效实现的功能。标准图书馆的new功能仅仅是#34;&#34;围绕它的异常安全和类型安全的包装器(如果你想要的话,你作为用户也可以覆盖它)。