1

代码如下:

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_alloc_template::allocate函数中malloc失败时会调用_S_oom_malloc。为什么它使用 malloc 来分配空间?

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

4

1 回答 1

0

首先,循环并不是真正的无限。有两种退出方式:抛出BAD_ALLOC异常和分配请求的内存量。当前 new-handler 为空指针时将引发异常。

要了解这是如何发生的,请参阅Effective C++中的第 49 条。基本上任何新处理程序都可以

  • 提供更多可用内存
  • 安装不同的新处理程序
  • 卸载新处理程序(即传递一个空指针到set_new_handler
  • 抛出异常
  • abort或者exit

其次,它使用 C 库malloc分配空间的原因是,malloc在大多数系统上,这是一个经过良好测试和高效实现的功能。标准库的new函数是围绕它的“简单”异常安全和类型安全的包装器(作为用户,您也可以覆盖它,如果您愿意的话)。

于 2013-05-18T10:16:53.420 回答