Я обнаружил очень странное поведение (на Clang и G CC) в следующей ситуации. У меня есть вектор, nodes
, с одним элементом, экземпляр класса Node
. Затем я вызываю функцию на nodes[0]
, которая добавляет новый Node
к вектору. Когда новый узел добавлен, поля вызывающего объекта сбрасываются! Тем не менее, они, похоже, снова возвращаются к нормальному состоянию после завершения функции.
Я считаю, что это минимальный воспроизводимый пример:
#include <iostream>
#include <vector>
using namespace std;
struct Node;
vector<Node> nodes;
struct Node{
int X;
void set(){
X = 3;
cout << "Before, X = " << X << endl;
nodes.push_back(Node());
cout << "After, X = " << X << endl;
}
};
int main() {
nodes = vector<Node>();
nodes.push_back(Node());
nodes[0].set();
cout << "Finally, X = " << nodes[0].X << endl;
}
Какие выходные данные
Before, X = 3
After, X = 0
Finally, X = 3
Хотя вы ожидаете, что X останется неизменным в процессе.
Другие вещи, которые я пробовал:
- Если я уберу строку, которая добавляет
Node
внутри set()
, то каждый раз он выдает X = 3. - Если я создаю новый
Node
и вызываю его на этом (Node p = nodes[0]
), то получается 3, 3, 3 - Если я создаю ссылка
Node
и вызовите ее на этом (Node &p = nodes[0]
), тогда на выходе будет 3, 0, 0 (возможно, это потому, что ссылка теряется при изменении размера вектора?)
это неопределенное поведение по какой-то причине? Почему?