如何在C++中正确递增返回的迭代器?

Zol*_*ern 1 c++ iterator runtime-error segmentation-fault

我有一个输入迭代器,CSVIterator如本SO 答案中所定义.

在我的程序中,我现在想要在函数中返回这样的迭代器并在我的函数中使用它main().返回迭代器,我可以访问其内容.但是在尝试迭代时,我遇到了分段错误.在返回函数内迭代起作用.

我有两个问题:

  1. 为什么我遇到了seg故障?我认为它是范围问题,但是不应该已经访问迭代器的内容导致分段错误?

  2. 我的问题怎么解决?我们的想法是在正确的迭代中将打开的文件切换到更大的循环中,并始终从该特定文件的开头开始.我来自Python背景和yield文件的一行之后另一个对我来说很自然,但也许在C++中不推荐它?

这是代码

// For the definition of CSVIterator, see
// https://stackoverflow.com/a/1120224/2525159
CSVIterator fileIter(int time)
{
    std::string tstring = std::to_string(time);
    std::string ext = ".csv";
    std::ifstream file(tstring + ext);
    CSVIterator iter(file);
    // This would work:
    // ++iter;
    return iter;
}

int main()
{
    CSVIterator csvit;
    for (i=0; i<10000; i++) {
        if (i%20 == 0) {
            csvit = fileIter(i);
        }

        // I can access the iterator's contents
        // like (*csvit)[0] correctly.
        // However,iterating in here doesn't work.
        ++csvit; // seg fault here
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

gsa*_*ras 5

是的,因为file是一个局部变量.这意味着你正在迭代超出范围的东西(当函数终止时),这引发了Undefined Behavior,这解释了崩溃.


注意你在链接的答案中file是如何在里面声明的main().