如何检查 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 将取消

矢量调整大小后下标超出范围

std :: unordered_map向量下标超出范围

如何使用 mpi scatter 修复“矢量下标超出范围”?

如何使 std::vector 的 operator[] 编译在 DEBUG 中而不是在 RELEASE 中进行边界检查

如何正确分配和解除分配向量图