действительно ли эти строки вызывают утечки памяти?
Память, выделенная в строке Node* node = new Node(data)
, потенциально утечка. По крайней мере, пример не показывает, где указатель будет удален. Право собственности может быть передано в add_helper
, но это исключено из примера.
Я не знаком с доктором Памяти, но предположил бы, что он сообщает, где была выделена утечка памяти; не там, где было утечка.
Более того, если вы сделаете копию экземпляра dt
, поведение программы будет неопределенным, поскольку и оригинал, и копия будут пытаться удалить скопированный указатель.
Чтобы исправить и потенциальную утечку памяти, и потенциальный UB, используйте уникальный указатель. Так же, как вы использовали с Node
.
Я не могу использовать unqiue_ptr для root, потому что есть несколько указателей на один и тот же узел.
Делая delete root;
в деструкторе, ваш класс приобретает уникальное владение указателем. Если это предположение верно, то нет проблем с использованием уникального указателя. Если предположение неверно, то деструктор, вероятно, ведет к неопределенному поведению. Использование этого вместо уникального указателя не является решением. Возможно, вам придется использовать совместно используемый указатель.
Наконец, если ваше дерево не сбалансировано, неявный рекурсивный деструктор имеет линейно увеличивающуюся глубину рекурсии в худшем случае, что может легко вызвать переполнение стека. Вам следует либо сбалансировать дерево (например, с помощью red-back или аугментаций AVL), либо использовать итеративный алгоритм для уничтожения дочерних элементов.