【问题标题】:How to correctly increment a returned iterator in C++?如何在 C++ 中正确递增返回的迭代器?
【发布时间】:2016-05-25 09:37:10
【问题描述】:

我有一个输入迭代器 CSVIterator 定义于此 SO answer

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

我有两个问题:

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

  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;
}

【问题讨论】:

    标签: c++ iterator segmentation-fault runtime-error


    【解决方案1】:

    是的,因为file 是一个局部变量。这意味着您正在迭代超出范围的内容(当函数终止时),这会引发 Undefined Behavior,从而解释了崩溃。


    注意在您链接的答案中,file 是如何在 main() 中声明的。

    【讨论】:

    • 有道理,谢谢!现在可以在 main() 中定义文件了。
    猜你喜欢
    • 1970-01-01
    • 2018-01-12
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    相关资源
    最近更新 更多