Удаление объекта в boost-обертке в C++
У меня есть класс, который имеет элементstd::list<boost::reference_wrapper<polygonType> > m_children;
Когда объект создается из этого класса, я сохраняю все дочерние элементы этого объекта как ссылку в этой переменной. Я хотел, чтобы при вызове деструктора объекта я хотел вызвать деструктора детей.
- Это автоматическое поведение в этом случае? или мне нужно что-то написать для этого, дать в этом списке ссылки?
- Если я хочу, чтобы они не были удалены, что мне нужно сделать? Если я хочу, чтобы они были удалены, что мне нужно сделать?
Это в основном сводится к некоторым проектным решениям, которые я принял, и к тому, как я хочу их исправить.
1 ответ
Это автоматическое поведение в этом случае?
Хранение reference_wrapper
эквивалентно хранению необработанного указателя. На самом деле, нет веских причин для хранения reference_wrapper
скорее, чем polygonType*
Вот.
Если я хочу, чтобы они не были удалены, что мне нужно сделать?
Хранить указатели (или reference_wrapper
, если вы настаиваете на запутывании). Вероятно, было бы более эффективно использовать vector
скорее, чем list
:
std::vector<polygonType*> children;
Вы должны быть осторожны, чтобы то, что несет ответственность за уничтожение детей, не оставляло здесь висячие указатели. Вы можете рассмотреть возможность управления ими с помощью общих указателей и сохранения слабых указателей в списке, чтобы этого не произошло.
Если я хочу, чтобы они были удалены, что мне нужно сделать?
Если polygonType
это конкретный тип, то вы можете хранить дочерние элементы прямо в списке. В этом случае, list
может быть лучшим выбором, так как он никогда не будет копировать или перемещать содержащиеся в нем объекты:
std::list<polygonType> children;
Если это полиморфный базовый класс, и вы не можете хранить объекты напрямую, тогда сохраняйте умные указатели. Снова, vector
вероятно, лучший выбор, чем list
если вы храните указатели, а не объекты:
std::vector<std::unique_ptr<polygonType>> children;
Если вы застряли с библиотекой до 2011 года, вы можете использовать boost::shared_ptr
скорее, чем std::unique_ptr
; или, возможно, контейнер указателя Boost.