我正在尝试设计一个需要动态分配内存的类。
我原本计划在构建期间分配所需的内存,但如何处理失败的内存分配?我应该抛出异常吗?我在某处读到异常只应该用于“特殊”情况,并且内存耗尽对我来说似乎不是特例。
我应该在单独的初始化例程中分配内存并检查失败,然后优雅地销毁类实例吗?
或者我应该使用例外吗?如果这些内存分配失败,该类将没有任何有用的东西。
将会看到如何解决这个问题..谢谢.. :))
答案 0 :(得分:15)
假设您使用new来分配内存,并且没有覆盖new
运算符,如果无法正确分配内存,它将自动抛出std::bad_alloc
异常。
我在某处读到了异常 应该只用于“特殊” 案件,以及内存不足 似乎不是一个例外情况 给我..
对我来说,内存耗尽似乎是一个非常特殊的情况:)
处理这种情况非常困难。您可能希望向应用程序的用户返回有意义的错误,但如果由于内存不足而导致问题,您甚至无法负担分配错误消息的内存。这真的是一个抓住22的情况。
有一种防御性编程技术(有时称为内存降落伞或雨天基金),您可以在应用程序启动时分配一块内存。然后,当您处理bad_alloc
异常时,释放此内存,并使用可用内存正常关闭应用程序,包括向用户显示有意义的错误。这比崩溃要好得多:)
答案 1 :(得分:3)
我认为耗尽内存(特别是堆内存)是一种特殊情况,如果你的类 - 以及你的应用程序 - 无法继续,我认为异常抛出/处理是一种非常合适和优雅的方法。 / p>
答案 2 :(得分:1)
内存不足时C ++中的常见行为是抛出异常。内置的new
运算符默认执行此操作。