Rumah  >  Soal Jawab  >  teks badan

c++ - Beberapa keraguan tentang operator new() dan mengendalikan dalam 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...
    }
}

Saya tahu bagaimana ini endless loop是为了等分配成功内存然后返回指针, 不过我的操作系统知识非常不扎实(非科班), 所以想请教下大家这里的endless loop的第二个if dianalisis (seperti pemprosesan pemegang di sini, dll.

).

Terima kasih

淡淡烟草味淡淡烟草味2685 hari yang lalu785

membalas semua(1)saya akan balas

  • 阿神

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

    _callnewh akan memanggil pemegang untuk mengendalikan kegagalan peruntukan memori. Pemegang ini boleh cuba melepaskan sedikit memori atau menunggu untuk tempoh masa atau membuang pengecualian secara langsung?. Jika panggilan pemegang berjaya mengembalikan _callnewh(size) != 0, maka yang baru akan cuba digunakan semula Jika panggilan gagal _callnewh(size) == 0, yang berkaitan tidak normal. _callnewh(size) != 0,那么new会再一次尝试申请,如果调用失败_callnewh(size) == 0,则抛出相关异常。

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

    jika (saiz == SIZE_MAX) bermakna bilangan objek yang dipohon adalah terlalu banyak (size_t secara teorinya boleh menyatakan bilangan sebarang objek). else ialah kegagalan aplikasi umum. std_bad_array_new_length dan std_bad_alloc merujuk kepada pengecualian yang sepadan dalam perpustakaan standard.

    Antara muka yang berkaitan: _set_new_handler🎜

    balas
    0
  • Batalbalas