Linux与Windows平台对象分配失败的适配错误码咨询
内存分配失败的平台错误码选择
Linux 平台
- C++ 默认行为下,
new分配内存失败会抛出std::bad_alloc异常,不会返回 NULL;如果使用new(std::nothrow)方式分配,失败时才会返回 NULL,此时对应的系统错误码是ENOMEM(定义在<errno.h>),语义就是内存不足。 - 你提供的代码场景属于内存分配失败,对应错误类型是
out_of_memory,匹配ENOMEM错误码。
Windows 平台
- Windows 下默认
new分配失败同样会抛出异常,若用new(std::nothrow)让分配失败返回 NULL,对应的系统错误码是ERROR_OUTOFMEMORY(定义在<winerror.h>,值为 0x0000000E)。 - 这个场景里应该选
out_of_memory类型错误码,invalid_handle(句柄无效,和内存分配无关)、invalid_operation(操作无效,不匹配内存耗尽场景)都不适用。
代码补充说明
你的代码里默认 new 分配失败不会返回 NULL,if (b == NULL) 这个判断在标准 C++ 下永远不会触发。如果要让 new 失败时返回 NULL,需要改用 std::nothrow 版本:
B* b = new(std::nothrow) B();
内容的提问来源于stack exchange,提问作者suprit
相关产品推荐
相关产品推荐

