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
是如何分析的(例如這裡句柄的處理等).
謝謝
阿神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