首頁  >  問答  >  主體

c++ - msvc裡面的這個operator new()與句柄等的一些疑惑?

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...
    }
}

我知道這個endless loop是為了等分配成功內存然後返回指針, 不過我的操作系統知識非常不紮實(非科班), 所以想請教下大家這裡的endless loop 的第二個if是如何分析的(例如這裡句柄的處理等).

謝謝

淡淡烟草味淡淡烟草味2736 天前836

全部回覆(1)我來回復

  • 阿神

    阿神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

    回覆
    0
  • 取消回覆