如何查找下标越界的位置

yangyongde2002 2010-01-07 03:21:11
程序偶尔能正常运行,偶尔不能。
挂掉的时候提示Microsoft Visual Studio C Runtime Library has detected a fatal error in myprogram.exe.
Press Break to debug the program or Continue to terminate the program.

下面是debug时的信息。

Debug Assertion Failed!
File: ...\vector
Line: 764

Expression: vector subscript out of range

For information on how your program can cause an assertion failure, see the Visual C++ document on asserts.


给出的提示是下标越界,我怎么去找哪个语句出现了越界啊?
因为程序比较长,单步运行比较困难,并且有些时候这个错误还不出现。

另外,我也读了一天代码了,也没有看出来哪有越界的。

有没有什么好的办法找到越界的位置啊?
...全文
466 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
tony_chenypc 2010-01-09
  • 打赏
  • 举报
回复
在Debug模式下看内存的分布
yshuise 2010-01-08
  • 打赏
  • 举报
回复
vector用at就可以了。
赵4老师 2010-01-08
  • 打赏
  • 举报
回复
试试将那个vector变量改为全局静态的,紧跟后面再定义一个新int变量,然后在调试环境下对这个int变量设置内存读写断点。
tanmeining 2010-01-08
  • 打赏
  • 举报
回复
不知道楼主添加assert检查没?如果添加了的话,这个错误就很好发现了,全工程搜索assert打断点单步就行了。
如果没有,那就看运行到哪个模块出的问题,然后在那个模块里面打断点,单步。这个断点基本靠经验来判断。
pady_pady 2010-01-08
  • 打赏
  • 举报
回复
vec.size()是内联函数,会被直接优化成读取
size_type _Size这个地址数值的.
只能说for_each更符合stl编程风范吧,如果那样,根本就不应该用[]访问元素,要用也得用iterator,呵呵
macrojj 2010-01-08
  • 打赏
  • 举报
回复
那你用at()来访问吧
Jim_King_2000 2010-01-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 pady_pady 的回复:]
引用 10 楼 ropert911 的回复:
...

你只需查找每个调用vector[]操作符的地方,很容易的啊,用下标访问,最好是用类似
for( i = 0; i < vec.size(); ++i )
  vec[i];
这样就不会越界了
[/Quote]
这段代码中,vec.size()会被调用很多次。因此最好把它移出for循环。
使用vector最好的方式是利用泛型算法。多用for_each, transform等。《Effective STL》一书中有精彩论述。
pady_pady 2010-01-08
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 ropert911 的回复:]
不知道你是不是用下标来访问vector的。
[/Quote]

reference operator[](size_type _Pos)
{ // subscript mutable sequence

#if _HAS_ITERATOR_DEBUGGING
if (size() <= _Pos)
{
_DEBUG_ERROR("vector subscript out of range");
_SCL_SECURE_OUT_OF_RANGE;
}
#endif /* _HAS_ITERATOR_DEBUGGING */
_SCL_SECURE_VALIDATE_RANGE(_Pos < size());

return (*(_Myfirst + _Pos));
}


你只需查找每个调用vector[]操作符的地方,很容易的啊,用下标访问,最好是用类似
for( i = 0; i < vec.size(); ++i )
vec[i];
这样就不会越界了
yangyongde2002 2010-01-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 pady_pady 的回复:]
引用 10 楼 ropert911 的回复:
不知道你是不是用下标来访问vector的。

C/C++ code
referenceoperator[](size_type _Pos)
{// subscript mutable sequence#if _HAS_ITERATOR_DEBUGGINGif (size()<= _Pos)
{
_DEBUG_ERROR("vector subscript out of range");
_SCL_SECURE_OUT_OF_RANGE;
}#endif /* _HAS_ITERATOR_DEBUGGING */
_SCL_SECURE_VALIDATE_RANGE(_Pos< size());return (*(_Myfirst+ _Pos));
}

你只需查找每个调用vector[]操作符的地方,很容易的啊,用下标访问,最好是用类似
for( i = 0; i < vec.size(); ++i )
  vec[i];
这样就不会越界了
[/Quote]
我就是这么写的。查找了一下所有的"[",发现都是这么用的。
另外,查找的过程我也把[i]改成.at(i)了
ropert911 2010-01-07
  • 打赏
  • 举报
回复
不知道你是不是用下标来访问vector的。
cattycat 2010-01-07
  • 打赏
  • 举报
回复
编码要养成好习惯,这样出了bug好跟踪,编程珠玑也是这么建议的。assert在release版不存在,所以不影响效率。
Jim_King_2000 2010-01-07
  • 打赏
  • 举报
回复
就是会有很多的assert。但是调试很方便。
还有就是,assert在release版本中不存在,因此并不会影响程序效率。
yangyongde2002 2010-01-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jim_king_2000 的回复:]
鼓励防御性编程。建议在所有用到下标的地方添加assert。
例如:

const size_t LEN = 10;
int some_arr[LEN];
...

assert(index >= 0 && index < LEN);
some_arr[index] = ...

[/Quote]

这样写的话,里面岂不是会有太多的assert
  • 打赏
  • 举报
回复
找个工具来检测一下。

wangxipu 2010-01-07
  • 打赏
  • 举报
回复
把用到vector的地方都加个断点,跟踪
Jim_King_2000 2010-01-07
  • 打赏
  • 举报
回复
鼓励防御性编程。建议在所有用到下标的地方添加assert。
例如:

const size_t LEN = 10;
int some_arr[LEN];
...

assert(index >= 0 && index < LEN);
some_arr[index] = ...
redlives 2010-01-07
  • 打赏
  • 举报
回复
人品很重要,努力和耐心也很重要

读代码+log/printf
taodm 2010-01-07
  • 打赏
  • 举报
回复
再认真读几天呗。
这种bug一旦发生,基本就看人品值了。

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧