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

标签 c++ exception memory error-handling raii

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

我计划在构造期间分配它需要的内存,但我该如何处理失败的内存分配?我应该抛出异常吗?我在某处读到异常应该只用于“异常(exception)”情况,内存不足对我来说似乎不是异常(exception)情况..

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

或者我应该改用异常?如果这些内存分配失败,该类将无事可做。


编辑:共识似乎是内存不足是一个异常(exception)情况。

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

最佳答案

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

I read somewhere that exceptions should only be used for "exceptional" cases, and running out of memory doesn't seem like an exceptional case to me..

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

这种情况很难处理。您可能希望向您的应用程序的用户返回一个有意义的错误,但如果这是由于内存不足引起的问题,您甚至可能无法负担分配错误消息的内存。这确实有点像 22 条军规。

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

关于c++ - 什么时候适合使用 C++ 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/584599/

相关文章:

c++ - 至 "if, if, if"或至 "if, else if, else if, else"

c++ - 通过套接字发送整数数组时出现问题

带有进度条和 GridView 的 Android 图像下载器(Android 运行时)

c - 为什么我的 C 管道输出仍然产生垃圾数据?

c++ - std::async 与 std::promise

c++ - 优化C++位图处理算法

java - 如何在 Java 中使用 try-catch 处理不同的异常 http 类型?

java - 无法从 Eclipse 查看 Tomcat 启动期间抛出的异常

c++ - 使 clang 的 Memory Sanitizer 报告统一变量使用而不决定分支

python - 使内存中的数据与长时间运行的 Python 脚本的文件保持同步