簡體   English   中英

使用它作為類變量時std :: iterator分段錯誤

[英]std::iterator segmentation fault when using it as a class variable

請考慮以下代碼段

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()的第一行,它可以正常工作。 我想得到這種行為的解釋。

在構造函數中,for itr = testMap.begin(); testMap是指函數參數,而不是數據成員。 當離開構造函數時,它會被打亂, itr 之后的任何解除引用都會導致UB。

你可以改成它

itr = this->testMap.begin();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM