Heim  >  Fragen und Antworten  >  Hauptteil

c++ - Einige Zweifel an Operator new() und Handles in msvc?

void* __CRTDECL operator new(size_t const size)
{
    for (;;)
    {
        if (void* const block = malloc(size))
        {
            return block;
        }

        if (_callnewh(size) == 0)
        {
            if (size == SIZE_MAX)
            {
                __scrt_throw_std_bad_array_new_length();
            }
            else
            {
                __scrt_throw_std_bad_alloc();
            }
        }

        // The new handler was successful; try to allocate again...
    }
}

Ich weiß, wie das endless loop是为了等分配成功内存然后返回指针, 不过我的操作系统知识非常不扎实(非科班), 所以想请教下大家这里的endless loop的第二个if analysiert wird (z. B. die Verarbeitung von Griffen hier usw.).

Danke

淡淡烟草味淡淡烟草味2685 Tage vor786

Antworte allen(1)Ich werde antworten

  • 阿神

    阿神2017-05-16 13:32:35

    _callnewh会调用一个句柄,来处理内存分配失败。这个句柄可以尝试释放一些内存或者等待一段时间或者直接抛个异常?。如果句柄调用成功返回_callnewh(size) != 0,那么new会再一次尝试申请,如果调用失败_callnewh(size) == 0,则抛出相关异常。

    if (size == SIZE_MAX)说明申请的对象数太多(size_t理论上能表达任何对象的数量)。else是一般的申请失败。std_bad_array_new_length和std_bad_alloc指在标准库中对应的异常。

    相关接口: _set_new_handler

    Antwort
    0
  • StornierenAntwort