反转循环导致系统错误

时间:2012-03-20 04:12:46

标签: c++ loops for-loop crash

这感觉像是一个新手问题,但我似乎无法弄明白。我想迭代std :: vector中的项目。目前我使用这个循环:

for (unsigned int i = 0; i < buffer.size(); i++) {
    myclass* var = buffer.at(i);
    [...]
}

然而,我意识到我实际上想以相反的顺序迭代它:从最后开始并以我的方式运行到0.所以我尝试使用这个迭代器:

for (unsigned int i = buffer.size()-1; i >= 0; i--) {
    myclass* var = buffer.at(i);
    [...]
}

但是通过简单地用旧的替换旧行(当然还有重新编译),然后它从正确运行并迭代代码,它会导致程序在第一次遇到此行时崩溃,错误:

http://i43.tinypic.com/20sinlw.png

接着是“[程序]已停止工作”对话框。

该程序还返回退出代码3,根据Code :: Blocks,(如果要相信this article)表示ERROR_PATH_NOT_FOUND:系统找不到指定的文件。

有什么建议吗?我只是在我的for循环中遗漏了一些可能导致某种内存问题的东西吗?返回代码3或文章是误导性的,它实际上并不意味着“未找到路径”?

3 个答案:

答案 0 :(得分:3)

无符号整数始终>> = 0.此外,从0递减到大数。

答案 1 :(得分:2)

i == 0(即应该是最后一次迭代)时,减量i--会导致i回绕到unsigned int的最大可能值。因此,条件i >= 0仍然成立,即使您希望循环停止。

要解决此问题,您可以尝试这样的方法,它维护原始循环逻辑,但会产生递减i

unsigned int i;
unsigned int size = buffer.size();
for (unsigned int j = 0; j < size; j++) {
    i = size - j - 1;

或者,由于std::vector定义了rbeginrend方法,因此您可以使用迭代器:

for(typename std::vector<myclass *>::reverse_iterator i = buffer.rbegin(); i != rend(); ++i)
{
    myclass* var = *i;
    // ...
}

(可能存在小的语法错误 - 我没有编译器方便)

答案 2 :(得分:0)

#include <vector>

using namespace std;

int main() {
    vector<int> buffer = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    for (vector<int>::reverse_iterator it = buffer.rbegin(); it != buffer.rend(); it++) {
        //do your stuff
    }
    return 0;
}