list爲什麼“越界”了,還能輸出值

1 問題

list<int> List;
    List.push_back(1);
    List.push_back(2);
    List.push_back(3);
    List.push_back(4);
    List.push_back(5);
    List.push_back(6);
    list<int>::iterator iterator1 = List.begin();
    while(iterator1 != List.end()){
        list<int>::iterator i, j, k;
        i = (iterator1++);
        j = i;
        k = (++j);
        cout <<" i:"<<  *i;
        cout <<" k:" << *k;
        cout <<endl;
    }

輸出:
在這裏插入圖片描述
爲什麼最後一個k明明指向了end迭代器,爲什麼還能輸出值呢?
改變源代碼:

    list<int> List;
    List.push_back(1);
    List.push_back(2);
    List.push_back(3);
    List.push_back(4);
    List.push_back(5);
    List.push_back(8);
    list<int>::iterator iterator1 = List.begin();
    while(iterator1 != List.end()){
        list<int>::iterator i, j, k;
        i = (iterator1++);
        j = i;
        k = (++j);
        cout <<" i:"<<  *i;
        cout <<" k:" << *k;
        cout <<endl;
    }

輸出:
在這裏插入圖片描述
發現端倪。

2 問題解決

因爲list是動態分配內存的,實際上alloc分配的內存不是插入的實際數值個數,實際分配的內存可能是插入數值的2倍或1.5倍(爲了防止頻繁插入超過容器的空間後,重新分配內存)。

因此雖然k指向了end迭代器,但是輸出了值。不過這個值是隨機分配的,沒有任何實際意義。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章