Maison  >  Questions et réponses  >  le corps du texte

c++ - Des doutes sur l'opérateur new() et les handles dans 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...
    }
}

Je sais comment cela endless loop是为了等分配成功内存然后返回指针, 不过我的操作系统知识非常不扎实(非科班), 所以想请教下大家这里的endless loop的第二个if est analysé (comme le traitement des poignées ici, etc.

).

Merci

淡淡烟草味淡淡烟草味2685 Il y a quelques jours787

répondre à tous(1)je répondrai

  • 阿神

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

    _callnewh appellera un handle pour gérer l'échec de l'allocation de mémoire. Ce handle peut essayer de libérer de la mémoire ou attendre un certain temps ou lancer une exception directement ?. Si l'appel handle renvoie avec succès _callnewh(size) != 0, alors new tentera de s'appliquer à nouveau. Si l'appel échoue _callnewh(size) == 0, le correspondant. anormal. _callnewh(size) != 0,那么new会再一次尝试申请,如果调用失败_callnewh(size) == 0,则抛出相关异常。

    if (size == SIZE_MAX)说明申请的对象数太多(size_t理论上能表达任何对象的数量)。else

    if (size == SIZE_MAX) signifie que le nombre d'objets demandés est trop important (size_t peut théoriquement exprimer le nombre de n'importe quel objet). else est un échec général de l'application. std_bad_array_new_length et std_bad_alloc font référence aux exceptions correspondantes dans la bibliothèque standard.

    Interface associée : _set_new_handler🎜

    répondre
    0
  • Annulerrépondre