如何检查 std::vector 超出范围的访问
Posted
技术标签:
【中文标题】如何检查 std::vector 超出范围的访问【英文标题】:How to check for std::vector out of range access 【发布时间】:2013-11-06 19:48:39 【问题描述】:[在此处找到重复项:C++ - detect out-of-range access]
如果我有一个“超出范围向量访问”的程序,像这样:
std::vector<int> A(2);
...
A[10] = 3;
我有办法确定找到这个错误吗? 我的意思是在调试模式下编译,看看是否有断言会停止执行。
到目前为止,我已经自己检查过了。但是可能我不需要编写额外的代码吗?
附:我当然检查了断言。它没有调用。
有了这个程序:
#include <vector>
int main()
std::vector<int> A(2);
A[10] = 3;
return 0;
编译
g++ 1.cpp -O0; ./a.out
所以看起来std在代码中没有断言,我不禁想知道他们为什么不做这么简单的检查。
【问题讨论】:
C++ - detect out-of-range access的可能重复 【参考方案1】:使用at()
成员函数:
std::vector<int> A(2);
A.at(10) = 3; //will throw std::out_of_range exception!
因为它可能会抛出异常,所以你想捕获它。所以使用try catch
块!
希望对您有所帮助。
【讨论】:
www.google.com --> c++ 超出范围异常 --> cplusplus.com/reference/stdexcept/out_of_range @stellarossa:这是一个糟糕的网站。改用这个:en.cppreference.com/w/cpp/container/vector/at @Nawaz:我知道。关键是,当您搜索问题时,它实际上是您在 google 上获得的第一个点击,它甚至为您提供了一个示例。我不明白为什么人们不先尝试。事实上,如果您搜索 OP 的确切问题“如何检查 std::vector 超出范围的访问” - 你猜怎么着? @stellarossa,哦,“如何检查 std::vector 超出范围的访问”几乎正是我所需要的。谢谢! @klm123:不用担心,在发帖前先用谷歌搜索一下;无论您遇到什么问题(尤其是初学者的问题),网上都可能有解决方案:)【参考方案2】:我有办法确定找到这个错误吗?我的意思是在调试模式下编译并查看某些断言是否会停止执行。
Valgrind 很容易发现这些错误。运行:
valgrind ./YOUR_EXECUTABLE
我忍不住想他们为什么不做这么简单的检查。
看到这个answer。
【讨论】:
以上是关于如何检查 std::vector 超出范围的访问的主要内容,如果未能解决你的问题,请参考以下文章
当我返回其引用时,如果超出范围,静态 std::vector 将取消
如何使用 mpi scatter 修复“矢量下标超出范围”?
如何使 std::vector 的 operator[] 编译在 DEBUG 中而不是在 RELEASE 中进行边界检查