MST

星途 面试题库

面试题:C++中new和malloc调用内存分配失败时处理机制对比

当使用new和malloc进行内存分配时,如果分配失败,它们各自的处理机制是怎样的?在实际编程中,如何根据这两种不同的机制来编写健壮的内存分配代码?
46.0万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

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("内存分配失败");
}

编写健壮内存分配代码

  1. 使用 new
    • 使用 try - catch 块来捕获 std::bad_alloc 异常,在 catch 块中进行适当的错误处理,如记录日志、提示用户、尝试其他分配策略等。
    • 对于自定义类型,可以重载 operator newoperator delete 来实现特定的内存分配和释放策略,同时在重载的 operator new 中处理可能的内存分配失败情况。
  2. 使用 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));