问题描述
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是如何分析的(比如这里句柄的处理等).
谢谢
问题解答
回答1:_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