c++ - 捕获 std::bad_alloc 的策略

标签 c++ coding-style new-operator try-catch

所以我在开发过程中经常使用 Qt 并且喜欢它。 Qt 对象的通常设计模式是使用 new 分配它们。

几乎所有示例(尤其是 Qt 设计器生成的代码)都绝对不检查 std::bad_alloc 异常。由于分配的对象(通常是小部件等)很小,这几乎不是问题。毕竟,如果您未能分配 20 字节之类的内容,那么您可能无法解决问题。

目前,我采用了将“大”(大小超过一页或两页的任何内容)分配包装在 try/catch 中的策略。如果失败,我会向用户显示一条消息,几乎任何更小的消息,我都会让应用程序崩溃并出现 std::bad_alloc 异常。

那么,我想知道这方面的学派是什么?

检查每个 new 操作是否是好的策略?还是只有我认为有可能失败的那些?

此外,在处理资源可能受到更多限制的嵌入式环境时,情况显然完全不同。我在桌面应用程序的上下文中询问,但也对涉及其他场景的答案感兴趣。

最佳答案

问题不在于“在哪里捕捉”,而是“捕捉到异常时该怎么做”。

如果你想检查,而不是用 try catch 你最好使用

    #include <new>
    x = new (std::nothrow) X();
    if (x == NULL) {
        // allocation failed
    }

我平时的做法是

  • 在非交互式程序中,在主级别捕获并在那里显示适当的错误消息。

  • 在具有用户交互循环的程序中,也要在循环中捕获,以便用户可以关闭一些东西并尝试继续。

特殊情况下,在其他地方,catch 是有意义的,但很少见。

关于c++ - 捕获 std::bad_alloc 的策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1308052/

相关文章:

c++ - 如何访问/迭代 unordered_multimap 中的所有非唯一键?

c++ - ob->i 应该返回 ob "this"的地址,但它返回 i ,任何解释?

PHP Zend Framework 编码标准,哪种方法更具可读性?

coding-style - Sublime Text 2设置自定义代码高亮

javascript - jQuery:创建新对象... $(object)

C++:push_back(new Object()) 是内存泄漏吗?

java - 新关键字和垃圾收集

C++实例化模板模板类

c++ - Thrift 服务器 : detect client disconnections (C++ library)

java - 在 "Clean Code,"中,可变数量的参数如何影响函数是单子(monad)、二元还是三元?