C++ new 失败的处理 - 抛出异常和不抛出异常

在C++中,new操作符通常用于在堆上分配内存。在某些情况下,new操作符可能会分配失败,例如内存不足。

下面将讨论new操作符在分配内存失败时的两种处理方式:抛出异常和不抛出异常。

抛出异常

当new操作符无法分配所需内存时,可以选择抛出std::bad_alloc异常。这个异常是C++标准库定义的一个异常类,表示内存分配失败。当程序捕获到这个异常时,可以采取相应的措施,例如释放已经分配的内存,或者向用户显示错误信息。

下面是一个示例,演示了使用new操作符分配内存时抛出std::bad_alloc异常的情况:

try {
    int *p = new int[1000000000]; // 请求分配 4GB 的内存
} catch (const std::bad_alloc& e) {
    // 内存分配失败,输出错误信息
    std::cerr << "Memory allocation failed: " << e.what();
}

上面的代码会尝试分配4GB的内存。由于内存不足,new操作符无法分配所需的内存,因此会抛出std::bad_alloc异常。在try块中,我们可以捕获这个异常,并输出错误信息。在实际的代码中,可以根据具体的应用场景来决定如何处理这个异常。

不抛出异常

当new操作符无法分配所需内存时,也可以选择不抛出异常,而是返回一个空指针。这种情况下,程序需要检查指针是否为空,以确定内存是否分配成功。

下面是一个示例,演示了使用new操作符分配内存时不抛出异常的情况:

int *p = new (std::nothrow) int[1000000000]; // 请求分配 4GB 的内存

if (p == nullptr) {
    // 内存分配失败,输出错误信息
    std::cerr << "Memory allocation failed." << std::endl;
} else {
    // 内存分配成功,使用指针 p 操作内存
    // ...
}

在上面的代码中,我们使用了std::nothrow参数来告诉new操作符不要抛出异常,而是返回一个空指针。然后,我们检查指针p是否为空,以确定内存是否分配成功。如果p为空,说明内存分配失败,程序就可以采取相应的措施,例如输出错误信息。如果p不为空,说明内存分配成功,我们就可以使用指针p来操作内存。

总结

在C++中,new操作符用于在堆上分配内存。当new操作符无法分配所需内存时,可以选择抛出std::bad_alloc异常或者返回一个空指针。这两种处理方式各有优缺点,需要根据具体的应用场景来决定如何处理内存分配失败的情况。在实际的代码中,需要对内存分配失败进行处理,以确保程序的正确性和稳定性。

原文链接:,转发请注明来源!