У меня есть базовый класс Widget< /code>, который может иметь дочерние объекты, унаследованные от виджета, а также может быть дочерним. У меня есть два противоположных подхода:
- Используйте необработанные указатели. Дочерний список будет выглядеть примерно так: std::vector Children и при уничтожении он удалит их всех (с помощью специального деструктора). Также при таком подходе пользователь может вручную удалить объект Widget, и он будет правильно очищен. Но необработанные указатели на объекты Widget иногда копируются во внутренние буферы библиотеки для рисования и других вещей. Если объект будет удален, находясь в каком-то буфере, это будет катастрофа.
- Используйте общие указатели. Объекты будут уничтожаться всякий раз, когда они действительно не используются, но если они имеют несколько родителей или находятся в каком-то буфере, они не будут удалены. Также пользователь не может вручную использовать удаление для принудительного удаления объекта, а только общий указатель на него. И я упомяну, что если пользователь попытается создать объект в стеке/куче вручную (без общего указателя), его время жизни будет управляться неправильно и приведет к очевидным последствиям.
Подробнее здесь: https://stackoverflow.com/questions/792 ... t-lifetime