Итератор C++ со слабыми указателями на элементы контейнера

У меня есть общий контейнер дерева, и я хотел бы реализовать итератор для обхода его элементов. В основном контейнере я использовал общие указатели для соединения различных узлов дерева.

Имеет ли смысл реализовывать итератор с использованием слабых указателей?

Дело в том, что если я удаляю узел из дерева во время использования итератора, ресурсы узла будут освобождены только тогда, когда итератор будет уничтожен (если я использую общие указатели). Со слабыми указателями я предполагаю, что ресурсы освобождаются сразу (возможно, делая итератор несогласованным, но это не важно).

Можете ли вы придумать другие решения этой проблемы?


person Kami    schedule 30.06.2014    source источник
comment
Если вы не используете нить, это не имеет значения? Если бы я понял, что вы сказали..   -  person    schedule 30.06.2014
comment
Проблема в том, что если я удалю узел во время итерации по дереву, я могу наткнуться на удаленный узел (поскольку он все еще находится в памяти). Когда я удаляю узел из дерева, итератор должен стать недействительным.   -  person Kami    schedule 30.06.2014


Ответы (1)


Во-первых, итераторы содержат только указатель на элемент-контейнер, а не на сам элемент. Так что не важно было это weak_ptr или нет.

Поэтому, если вы удалите элемент из контейнера, итератор может стать недействительным. Это означает, что он может указывать на мусорную память, освобожденную память, не-вашу-память, другой элемент (не тот, который вы думаете) и так далее.

Этот способ подвержен ошибкам и приведет к проблемам.

person PSIAlt    schedule 30.06.2014