ну, это не код очистки с множеством способов утечки памяти. Вот, я думаю, у вас проблемы с:
Tree() : _info(nullptr) {}
...
~Tree() {
delete _info;
}
Но, конечно, есть и другие места, где все может пойти не так:
Tree& operator= (Tree&& t) // check _info not null before calling delete _info
На словах - ваш class Tree
имеет два конструктора. Тот, который принимает значение типа T
: Tree(T data)
. Этот конструктор создает new
узел. Это конструктор, который вы используете для создания Tree
в вашей функции main()
.
Есть еще один конструктор, который у вас есть: по умолчанию. Это конструктор, который вызывается при создании дочерних узлов из class Node
: _children = new Tree<T,N>[N];
Этот конструктор по умолчанию Tree() : _info(nullptr)
не создает новый узел _info
.
Когда программа заканчивается и вызываются деструкторы - предпринимается попытка удалить nullptr
.
Простое исправление - изменить деструктор дерева:
~Tree() {
if (_info) delete _info;
}
YouNode::_children
- это массив деревьев, но когда вы вызываете getChildren
, вы возвращаете массив указателей. Так что вызов ins
скорее всего повредит память. Или это может работать случайно.
Лучше изменить getChildren
, чтобы либо вернуть ссылку на элемент как: Tree& getChildren(int index) { return _children[index]; }
, либо изменить значение _children
на Tree** _children;
С инициализацией как _children = new Tree<T,N>*[N];