Niekoniecznie akurat całe drzewo
Zauważ, że mam metodę, searchNode, która zwraca wskaźnik do odpowiedniego węzła. Na tym węźle również mogę wywołać metodę clearTree.
Ogólnie zamysł jest taki, że jeżeli usunę dany węzeł to usuwam również wszystkie odgałęzienia i liście jakie z niego wychodzą.
Jeżeli wywołam to na korzeniu to tak jakbym usunął całe drzewo.
Jeżeli wywołam ma węźle z trzeciego poziomu to te poniżej nie zostaną usunięte.
A dlaczego chcę to zrobić? Ponieważ czas życia obiektu zależy od klienta.
Gdybym zamiast delete this przypisał do tego nullptr to byłby to memory leak... ponieważ tracę uchwyt do zasobu. (Ale pewnie da się to załatwić poprzez shared i weak ptr )
Obiekt powinien kończyć życie przez wywołanie destruktora, jeżeli kontrola programu wychodzi poza scope.
Jednak jeżeli czas życia obiektu jest zależny od klienta to nie widzę innego sposobu.
Gdyby po wywołaniu metody clear, wywołał się jeszcze destruktor to byłoby to niezdefiniowane zachowanie (dwukrotne zniszczenie obiektu).
Pewnie jak zwykle zjebałem design, ale chciałbym chociaż wiedzieć jak zarządzać pamięcią w strukturach rekurencyjnych. Pierwszy raz mam do czynienia z czymś takim

Co do smart pointerów to prototypuję strukturę podobną do drzewa, tylko ogólniejszą (tzn. graf) i tym razem na smartach:
class Graph
{
public:
explicit Graph(NodeProperties&& propertiesParam) : _mProperties{ std::move( propertiesParam ) } {
}
Graph& connectTo(std::shared_ptr<Graph>&& targetNode, EdgeProperties&& edgePropertiesParam) {
_mOutputNodes.push_back(std::make_pair(std::move(targetNode), std::move( edgePropertiesParam )));
return *_mOutputNodes.back().first;
}
void printGraph() const {
if (_mProperties._mIsMarked == true)
return;
_mProperties._mIsMarked = true;
std::cout << _mProperties._mValue << '\n';
for(const auto& node : _mOutputNodes)
node.first->printGraph();
}
int GraphSize() const {
}
~Graph() {
std::cout << "node is removed\n";
}
private:
std::list< std::pair< std::shared_ptr< Graph >, EdgeProperties > > _mOutputNodes;
NodeProperties _mProperties;
void clearNodeMarkFlags() {
for (const auto& node : _mOutputNodes) node.first->_mProperties._mIsMarked = false;
}
};
Jest oczywiscie kilka poprawek, jak chociażby metoda connectTo, ale to kilka minut pracy.