Вы создаете Node
s как локальные переменные в функции create
. Когда вы выходите из области действия функции, адреса, которые вы сохраняете как Node
s 'parent
, не будут содержать Node
, который был там ранее (каждый nn.parent
становится висящим указателем ).
Если вы хотите sh создать Node
s в функции, она должна выглядеть примерно так:
void create(Node* parent, list<Node>& graph)
{
if (graph.size() < 10)
{
Node* nn = new Node;
nn->node = parent->node + 1;
nn->parent = parent;
graph.push_back(*nn);
create(nn, graph);
}
}
Это, однако, вызовет несколько проблем:
- В этой строке
graph.push_back(*nn);
мы разыменовываем nn
, что приводит к ненужному копированию значений int
и Node*
(атрибуты структуры). - Мы вызываем утечку памяти, поскольку мы не являемся сохраняя значение
nn
в любом месте, поэтому мы не сможем удалить его содержимое позже.
Было бы лучше сохранить список Node*
вместо Node
:
list<Node*> graph;
Таким образом, мы могли бы просто выполнить итерацию по списку и позже удалить динамически выделенные Node
s:
for (auto i : graph)
delete i;
И вместо копирования значений int
и Node*
, мы просто pu sh Node* nn
к списку:
graph.push_back(nn);
Обратите внимание, что it
теперь является указателем на указатель, поэтому потребуется двойное разыменование:
cout << (**it).node << endl;
cout << (*(*(**it).parent).parent).node;