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
是为了等分配成功内存然后返回指针, 不过我的操作系统知识非常不扎实(非科班), 所以想请教下大家这里的endless loop
的第二个if
analysiert wird (z. B. die Verarbeitung von Griffen hier usw.).
_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