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
是為了等分配成功內(nèi)存然后返回指針, 不過(guò)我的操作系統(tǒng)知識(shí)非常不扎實(shí)(非科班), 所以想請(qǐng)教下大家這里的endless loop
的第二個(gè)if
analysiert wird (z. B. die Verarbeitung von Griffen hier usw.).
_callnewh會(huì)調(diào)用一個(gè)句柄,來(lái)處理內(nèi)存分配失敗。這個(gè)句柄可以嘗試釋放一些內(nèi)存或者等待一段時(shí)間或者直接拋個(gè)異常?。如果句柄調(diào)用成功返回_callnewh(size) != 0
,那么new會(huì)再一次嘗試申請(qǐng),如果調(diào)用失敗_callnewh(size) == 0
,則拋出相關(guān)異常。
if (size == SIZE_MAX)
說(shuō)明申請(qǐng)的對(duì)象數(shù)太多(size_t理論上能表達(dá)任何對(duì)象的數(shù)量)。else
是一般的申請(qǐng)失敗。std_bad_array_new_length和std_bad_alloc指在標(biāo)準(zhǔn)庫(kù)中對(duì)應(yīng)的異常。
相關(guān)接口: _set_new_handler