分配内存时的例外情况

时间:2011-09-17 15:36:22

标签: c++ exception new-operator

我刚刚学会了,如果内存分配不成功,你可以抛出或处理异常。但是在这里,我没有看到很多人在使用new operator时处理异常。

例如:在程序中的任何时候,以下内容都不会失败吗?

char* c = new char[1000];
delete []c;

如果有的话你应该怎么处理?

2 个答案:

答案 0 :(得分:3)

会引发异常 std::bad_alloc 您应该使用 try-catch 阻止它:

try
{
    char* c = new char[1000];
}
catch(std::bad_alloc &except)
{

}

我遵循的基本准则是例外:
尽可能处理异常,如果可以从异常中恢复,请采取必要的操作从中恢复,如果不能,则只需通过记录相应的诊断来终止应用程序/程序。 < / p>

如果内存分配失败,应用程序/程序通常无法继续或恢复,因此请通过记录某些诊断消息退出,或者通过允许异常向上传播来让它崩溃。

答案 1 :(得分:2)

大多数人没有明确处理bad_alloc异常的原因是因为大多数时候大多数用户应用程序都无法从低内存条件中恢复,所以让异常传播向外是最明智的事情。如果您可以执行合理的恢复操作,则应该只显式捕获异常。

在某些情况下,捕获std::bad_alloc异常是有意义的,例如,如果程序在分配大块内存失败时可以尝试替代方法。这仅适用于某些系统;在一个过度使用内存的系统中,推测性地分配一大块内存并期望std::bad_alloc将会失败。

显式捕获bad_alloc以进行清理通常表明资源不是由RAII样式类的适当实例管理的,这些类应该在析构函数中进行正确的清理,以确保它发生每当一个范围被留下时,无论是通过任何例外还是以其他方式。