c++ - 如何处理 std::vector 的错误?
问题描述
std::vector
分配可能失败的内存,但构造函数不能返回任何东西,我们应该使用try
吗?catch
每次我们声明一个std::vector
?
我知道这个问题可能已经回答了,但我没有找到任何东西,请评论链接。
解决方案
是的,其中使用的默认分配器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
实例都将是矫枉过正。
推荐阅读
- angular - Ionic 3 - 在第一次加载应用程序时从服务器端数据设置全局变量
- android - AutoCompleteTextView 设置高度以填充父级
- spring - Spring 集成 - 通道适配器与网关 (AMQP)
- apache - 本地主机网站/虚拟主机强制 www 前缀
- python - Virtualenv - IOError:[Errno 1] 不允许操作:'/bin/easy_install'
- php - 如何正确编号表中指示列中的行
- mysql - 通过掩码(正则表达式)从 MySQL 中获取 Substr
- lets-encrypt - Traefik Malformed Error 使用 ACME Lets Encypt Certificates & docker
- ios - Error Code : Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set."
- react-native - React-Navigation:声明时导航屏幕