面试题答案
一键面试new 内存分配失败处理机制
当 new
分配内存失败时,它会抛出 std::bad_alloc
异常。例如:
try {
int* ptr = new int[10000000000000]; // 很可能会分配失败
} catch (const std::bad_alloc& e) {
std::cerr << "内存分配失败: " << e.what() << std::endl;
}
malloc 内存分配失败处理机制
malloc
分配内存失败时,会返回 NULL
。例如:
int* ptr = (int*)malloc(10000000000000 * sizeof(int));
if (ptr == NULL) {
perror("内存分配失败");
}
编写健壮内存分配代码
- 使用
new
时:- 使用
try - catch
块来捕获std::bad_alloc
异常,在catch
块中进行适当的错误处理,如记录日志、提示用户、尝试其他分配策略等。 - 对于自定义类型,可以重载
operator new
和operator delete
来实现特定的内存分配和释放策略,同时在重载的operator new
中处理可能的内存分配失败情况。
- 使用
- 使用
malloc
时:- 每次调用
malloc
后都要检查返回值是否为NULL
,如果是,则根据具体情况进行错误处理,如释放已分配的其他资源、恢复程序到安全状态等。 - 可以封装
malloc
调用,在封装函数中进行返回值检查和统一的错误处理,提高代码的可维护性。例如:
- 每次调用
void* safe_malloc(size_t size) {
void* ptr = malloc(size);
if (ptr == NULL) {
perror("内存分配失败");
// 可以在这里添加更多自定义的错误处理逻辑
exit(EXIT_FAILURE);
}
return ptr;
}
然后在代码中使用 safe_malloc
替代 malloc
:
int* ptr = (int*)safe_malloc(100 * sizeof(int));