Weird behaviour with class fields when adding to a std::vector

前端 未结 2 1537
无人及你
无人及你 2021-02-05 01:58

I have found some very weird behaviour (on clang and GCC) in the following situation. I have a vector, nodes, with one element, an instance of class Node

2条回答
  •  挽巷
    挽巷 (楼主)
    2021-02-05 02:47

    Your code has undefined behavior. In

    void set(){
        X = 3;
        cout << "Before, X = " << X << endl;
        nodes.push_back(Node());
        cout << "After, X = " << X << endl;
    }
    

    The access to X is really this->X and this is a pointer to the member of the vector. When you do nodes.push_back(Node()); you add a new element to the vector and that process reallocates, which invalidates all iterators, pointers and references to elements in the vector. That means

    cout << "After, X = " << X << endl;
    

    is using a this that is no longer valid.

提交回复
热议问题