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

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

我有一个输入迭代器 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;
}

最佳答案

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


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

关于c++ - 如何在 C++ 中正确递增返回的迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37433183/

相关文章:

c - 为什么这个函数显示段错误?

c++ - gcc 根据优化创建崩溃代码

c++ - 哪个更有效 :A Win32 func. 或类似的 CRT func。在 VC++ 应用程序中?

java - Java 中删除元素时迭代 LinkedList

c++ - 在集合中找到一对 C++

c++ - 展平迭代器

c - BST 实现函数中的段错误

C++ 二维 vector 图

android - 使用 Binder 从 native cpp 应用程序中 bundle Intent

c++ - 如何在复合键控提升多索引容器的一个键上执行 equal_range 并在第二个键上执行 lower_bound?