如何检查 std::vector 的调整大小是否获得了适当的内存
How to check if resize of std::vector got appropriate memory
代码中
std::vector<int> vec(length);
vec.resize(2*length);
vec.push_back(4);
vec.reserve(3*length);
如果 n 次 length
整数分配失败,所有语句都可能抛出 bad_alloc
异常(参见 reserve and resize)。
我看到了两种处理此异常的方法
- 在可能的向量内存分配的所有出现处使用
try catch
子句来捕获异常。
- 重载
new
并为所有事件添加异常处理。
我维护着一个庞大的代码库,因此第一个选项接缝相当繁琐,也会破坏代码的可读性。
检查 std::vector
的内存分配是否有效的最佳实践是什么?
在程序或模块级别捕获 std::bad_alloc,此时您可以通过终止程序或取消模块所做的事情来正确处理它。
程序级别:
在您的 main 中添加一个 try catch,显示一条消息然后退出。
在模块级别:
在模块的入口点 DoStuffWhichRequiresALotOfMemory() 周围添加一个 try catch。确保在抛出 std::bad_alloc 之后,您的程序仍处于有效状态 f.i。该模块与程序的其余部分具有单独的状态,或者它的功能没有副作用。显示一条消息,您就完成了。
在如此低的级别处理内存分配失败是不切实际的。如果您需要这些保证,请预先分配所有内存(为整个模块,而不仅仅是为您的向量)并使用分配器。那么你只有一点可能会失败。
我知道这并不能直接回答问题,但我劝你再想想你的问题。
代码中
std::vector<int> vec(length);
vec.resize(2*length);
vec.push_back(4);
vec.reserve(3*length);
如果 n 次 length
整数分配失败,所有语句都可能抛出 bad_alloc
异常(参见 reserve and resize)。
我看到了两种处理此异常的方法
- 在可能的向量内存分配的所有出现处使用
try catch
子句来捕获异常。 - 重载
new
并为所有事件添加异常处理。
我维护着一个庞大的代码库,因此第一个选项接缝相当繁琐,也会破坏代码的可读性。
检查 std::vector
的内存分配是否有效的最佳实践是什么?
在程序或模块级别捕获 std::bad_alloc,此时您可以通过终止程序或取消模块所做的事情来正确处理它。
程序级别: 在您的 main 中添加一个 try catch,显示一条消息然后退出。
在模块级别: 在模块的入口点 DoStuffWhichRequiresALotOfMemory() 周围添加一个 try catch。确保在抛出 std::bad_alloc 之后,您的程序仍处于有效状态 f.i。该模块与程序的其余部分具有单独的状态,或者它的功能没有副作用。显示一条消息,您就完成了。
在如此低的级别处理内存分配失败是不切实际的。如果您需要这些保证,请预先分配所有内存(为整个模块,而不仅仅是为您的向量)并使用分配器。那么你只有一点可能会失败。
我知道这并不能直接回答问题,但我劝你再想想你的问题。