什么时候适合使用C ++异常?

时间:2009-02-25 03:27:26

标签: c++ exception memory error-handling raii

我正在尝试设计一个需要动态分配内存的类。

我原本计划在构建期间分配所需的内存,但如何处理失败的内存分配?我应该抛出异常吗?我在某处读到异常只应该用于“特殊”情况,并且内存耗尽对我来说似乎不是特例。

我应该在单独的初始化例程中分配内存并检查失败,然后优雅地销毁类实例吗?

或者我应该使用例外吗?如果这些内存分配失败,该类将没有任何有用的东西。


编辑:共识似乎是内存不足是一个例外情况。

将会看到如何解决这个问题..谢谢.. :))

3 个答案:

答案 0 :(得分:15)

假设您使用new来分配内存,并且没有覆盖new运算符,如果无法正确分配内存,它将自动抛出std::bad_alloc异常。

  

我在某处读到了异常   应该只用于“特殊”   案件,以及内存不足   似乎不是一个例外情况   给我..

对我来说,内存耗尽似乎是一个非常特殊的情况:)

处理这种情况非常困难。您可能希望向应用程序的用户返回有意义的错误,但如果由于内存不足而导致问题,您甚至无法负担分配错误消息的内存。这真的是一个抓住22的情况。

有一种防御性编程技术(有时称为内存降落伞或雨天基金),您可以在应用程序启动时分配一块内存。然后,当您处理bad_alloc异常时,释放此内存,并使用可用内存正常关闭应用程序,包括向用户显示有意义的错误。这比崩溃要好得多:)

答案 1 :(得分:3)

我认为耗尽内存(特别是堆内存)是一种特殊情况,如果你的类 - 以及你的应用程序 - 无法继续,我认为异常抛出/处理是一种非常合适和优雅的方法。 / p>

答案 2 :(得分:1)

内存不足时C ++中的常见行为是抛出异常。内置的new运算符默认执行此操作。