qosd: обезопашен обход дерева с модификацией
Примеров итератора с доступом на чтение я много оставил, а пример модификации дерева только один. И тот я сразу забыл перевести на итераторы (range-based for loop). Т.к. проход теперь не по вектору (он давал экземпляр умного указателя), а по обычному указателю (собственному прокси, если точнее), то узел разрушался уже в процессе его отключения от дерева. Добавил удержание ссылки в сам `unlinkParent()` (ну, нам действительно может быть нужно только безвозвратное удаление поддерева) и пример в `main.cpp` расширил и прокомментировал.
This commit is contained in:
@@ -37,7 +37,15 @@ public:
|
||||
|
||||
auto parentLink = parent->getLink();
|
||||
|
||||
parentLink->removeChild(getNode());
|
||||
/* NOTE:
|
||||
*
|
||||
* Keep a reference to the node we gonna to unlink.
|
||||
* Otherwise, we'll disappear between `removeChild` and
|
||||
* `setParent`. Do not rearrange these calls, because
|
||||
* we want to modify the tree top down.
|
||||
*/
|
||||
auto node = getNode();
|
||||
parentLink->removeChild(node);
|
||||
getLink()->setParent(nullptr);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user