考虑以下代码段

class ItrTest {
private:
    std::map<int, long> testMap;
    std::map<int, long>::iterator itr;

public:
    ItrTest(std::map<int, long> testMap): testMap(testMap) {
        itr = testMap.begin();
    }

    void printNext() {
        // itr = testMap.begin();
        for (; itr != testMap.end(); itr++) {
            cout<<"Key: "<<itr->first<<" Value:"<<itr->second<<endl;
        }
    }
};

int main() {
    std::map<int, long> m{
        { 0, 100l },
        { 1, 200l },
        { 2, 300l },
        { 3, 400l },
        { 4, 500l },
    };

    ItrTest t(std::move(m));
    t.printNext();
}

尝试访问迭代器中的值时,这将引发分段错误。显然发生这种情况是因为迭代器变得无效(对我而言,经过两次迭代。也许在不同的系统上它的行为有所不同)。如果我取消注释函数printNext()的第一行,它将正常工作。我想对此行为做一个解释。

最佳答案

在构造函数中,对于itr = testMap.begin();testMap引用函数参数,而不是数据成员。离开构造函数时,销毁了itr,它将被销毁。以后对其进行任何取消引用都将导致UB。

您可以将其更改为

itr = this->testMap.begin();

关于c++ - 将std::iterator用作类变量时出现段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57825616/

10-12 06:54