首页 > 解决方案 > 如何处理 std::vector 的错误?

问题描述

std::vector分配可能失败的内存,但构造函数不能返回任何东西,我们应该使用try吗?catch每次我们声明一个std::vector

我知道这个问题可能已经回答了,但我没有找到任何东西,请评论链接。

标签: c++vectorerror-handlingdynamic-memory-allocation

解决方案


是的,其中使用的默认分配器std::vector可能会引发“内存不足”等危急情况。未处理的异常会自动调用std::terminate(),它本身对于这些情况来说是一个足够好的处理程序,因为它们通常不应该发生(在具有虚拟内存的现代系统上,std::bad_alloc很少是内存不足的迹象,而是程序错误的迹象,比如尝试分配一个负数)。

所以“什么都不做”是处理潜在投掷的好方法std::vector

在 Linux 上你会得到terminate called after throwing an instance of 'std::bad_alloc', what(): std::bad_alloc, Aborted (core dumped).

不幸的是,有些平台(例如 Windows)std::terminate()什么都不打印。

因此,为了获得最佳可移植性,您可以在全局范围内将catch所有std异常打印一些有意义的错误消息,然后再退出。例如:

int main() {
    try {

        // program code ...

    } catch (std::exception const& e) {
        std::cerr << "Exception: " << e.what() << std::endl;
        exit(1);
    }
}

也不要忘记以类似的方式处理任何其他线程(如果有)。

在任何情况下,个人try-catch每个std::vector实例都将是矫枉过正。


推荐阅读