c++ - 如何检查 std::vector 的调整大小是否有适当的内存

标签 c++ exception vector resize

在代码中

std::vector<int> vec(length);
vec.resize(2*length);
vec.push_back(4);
vec.reserve(3*length);

如果分配 n 次 length 整数失败,所有语句都可能抛出 bad_alloc 异常(参见 reserveresize )。

我看到了两种处理这个异常的方法

  • 在可能的 vector 内存分配的所有出现处使用 try catch 子句来捕获异常。
  • 重载 new 并为所有事件添加异常处理。

我维护着一个庞大的代码库,因此第一个选项接缝相当麻烦,而且还会破坏代码的可读性。

检查 std::vector 的内存分配是否有效的最佳实践是什么?

最佳答案

在程序或模块级别捕获 std::bad_alloc,此时您可以通过终止程序或取消模块所做的操作来正确处理它。

在程序层面: 在您的 main 中添加一个 try catch,显示一条消息然后退出。

在模块级别: 在模块的入口点 DoStuffWhichRequiresALotOfMemory() 周围添加一个 try catch。确保在抛出 std::bad_alloc 之后你的程序仍然处于有效状态,f.i.该模块与程序的其余部分具有单独的状态,或者它的功能没有副作用。显示一条消息,您就完成了。

在如此低的级别处理内存分配失败是不切实际的。如果您需要这些保证,请预先分配所有内存(为整个模块,而不仅仅是为您的 vector )并使用分配器。那么你只有一点可能会失败。

我知道这并不能直接回答问题,但我敦促您再次考虑您的问题。

关于c++ - 如何检查 std::vector 的调整大小是否有适当的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53263513/

相关文章:

c++ - 如何在模板化基类中命名嵌套模板?

ios - 联系人框架在读取 imageData 时引发异常

java - 为什么这里是 ExceptionInInitializerError?

c++ - 多维 vector 的使用

c++ - 使用 OpenGL 或 D3D 绘制椭圆的有效方法

vector - 将Map <Vec <u8>,Vec <u8 >>展平为Vec <u8>,然后将其返回到Map <Vec <u8>,Vec <u8 >>

c++ - 任何可以处理这种情况的优秀 C++ 重构工具

c++ - 在 C++ 范围外调用对象

c++ - 为什么不能将 std::pair 与 std::initializer_list 进行比较

php - Laravel Eloquent 捕获特定异常