Если узел был создан с использованием 'new', его необходимо явно удалить, абсолютно. У них вопрос будет , где . Если вы удаляете узел (предполагается, что содержимое узла никому не нужно), вам также следует удалить сам узел после завершения удаления узлов из дерева.
Теперь ссылка на узел - это другое дело. Если ссылка является артефактом определения аргумента метода, вам не нужно ничего с этим делать. Ссылка была создана в стеке, чтобы помочь с вызовом метода. Если я помню мой C ++, ссылки никогда не могут быть нулевыми, что означает, что вам никогда не придется извиняться (плохая шутка), никогда не придется их удалять.
[EDIT]
ОП говорит: «Потому что я передал параметр Node * &, но преемником является только Node * в функции ...)», поэтому я предположил, что вы имели в виду нечто вроде:
void removeNode(Node*& node)
, который затем вызывается с помощью
void foo()
{
Node* n = new Node();
// for example
removeNode(n);
}
Мой C ++ немного устарел, но идея здесь в том, что 'n' - указатель, а тип аргумента removeNode () - это ссылка на указатель. Вызывающая сторона не знает, что ссылка задействована, она просто передает 'n', ожидая, что тип arg будет указателем на узел (Node *). Компилятор создает ссылку как обертку вокруг аргумента, поэтому только вызываемый объект знает о ссылке. Поскольку ссылка создается в стеке, она будет правильно управляться при возврате removeNode (). Узел, на который указывает 'n', все еще необходимо удалить, вопрос в том, какой код должен его обрабатывать.
Первой мыслью было бы, чтобы 'removeNode ()' сделал это. Одна проблема заключается в том, что он имеет только ссылку на него, и если вы удалите указатель (цель ссылки), ссылка будет нулевой, что является плохой идеей / недопустимо. Просто мысль о синтаксисе, чтобы попытаться это заставило меня съежиться.
Итак, сделайте для этого клиентский код, например:
void foo()
{
Node* n = new Node();
// for example
removeNode(n);
delete n;
}
В основном , вам нужен план для области действия ваших указателей узлов. Пока это согласованно, вы можете сделать это несколькими различными способами. Если вы хотите, чтобы removeNode () обрабатывал удаление, измените тип аргумента на указатель вместо ссылки и документируйте вызов, так что ожидается, что он одновременно удалит узел из дерева и удалит также память.