Вы не показали никаких конструкторов копирования.Таким образом, я предполагаю, что вы полагаетесь на конструкторы копирования по умолчанию, предоставленные компилятором.Это источник вашей проблемы.
Когда вы используете:
...push_back(Node(this));
в NodeEditor
, вы сохраняете копию Node(this)
.Однако, если Node
и NodeIO
не имеют правильно реализованных конструкторов копирования, объекты NodeIO
в объекте Node
в std::vector
будут указывать на недопустимый объект Node
-временный Node
объект.
Вот пример программы, которая показывает проблему.
#include <iostream>
#include <vector>
struct Node;
struct NodeIO {
Node* owner;
NodeIO(Node* _owner) : owner{ _owner } { }
};
struct NodeEditor;
struct Node {
NodeEditor* owner;
Node(NodeEditor* _owner) : owner(_owner)
{
std::cout << (void*)this << std::endl;
nodeIOList.push_back(NodeIO(this));
nodeIOList.push_back(NodeIO(this));
}
std::vector<NodeIO> nodeIOList;
};
struct NodeEditor {
NodeEditor()
{
nodeList.push_back(Node(this));
nodeList.push_back(Node(this));
}
std::vector<Node> nodeList;
};
int main()
{
NodeEditor editor;
for ( auto& node : editor.nodeList )
{
std::cout << (void*)(&node) << std::endl;
for (auto& nodeIO : node.nodeIOList )
{
std::cout << (void*)(nodeIO.owner) << std::endl;
}
}
}
Вывод:
0x7ffe53d34c30
0x7ffe53d34c50
0xae10c0
0x7ffe1af7a2a0
0x7ffe1af7a2a0
0xae10e0
0x7ffe1af7a2c0
0x7ffe1af7a2c0
Вывод ясно показывает значенияиз указателей на Node
объекты, которые были построены с использованием Node(this)
, и значений указателей на Node
объектов, которые хранятся в std::vector<Node>
.Обратите внимание, что объекты NodeIO
по-прежнему указывают на временные объекты Node
.Они указывают на main
.
Я попытался быстро исправить, но это не сработало.Мне нужно немного поработать над этим.
Вот решение, которое работает с конструкторами копирования по умолчанию.Он использует std::vector
из std::shared_ptr
с вместо std::vector
объектов.
#include <iostream>
#include <vector>
#include <memory>
struct Node;
struct NodeIO {
Node* owner;
NodeIO(Node* _owner) : owner{ _owner } { }
};
struct NodeEditor;
struct Node {
NodeEditor* owner;
Node(NodeEditor* _owner) : owner(_owner)
{
std::cout << (void*)this << std::endl;
nodeIOList.push_back(std::make_shared<NodeIO>(this));
nodeIOList.push_back(std::make_shared<NodeIO>(this));
}
std::vector<std::shared_ptr<NodeIO>> nodeIOList;
};
struct NodeEditor {
NodeEditor()
{
nodeList.push_back(std::make_shared<Node>(this));
nodeList.push_back(std::make_shared<Node>(this));
}
std::vector<std::shared_ptr<Node>> nodeList;
};
int main()
{
NodeEditor editor;
for ( auto& node : editor.nodeList )
{
std::cout << (void*)(node.get()) << std::endl;
for (auto& nodeIO : node->nodeIOList )
{
std::cout << (void*)(nodeIO.get()->owner) << std::endl;
}
}
}
Вывод:
0x1460c30
0x1461110
0x1460c30
0x1460c30
0x1460c30
0x1461110
0x1461110
0x1461110