Удаление объекта в пакете boost в С++
0 navderm [2013-09-11 18:13:00]
У меня есть класс, который имеет элемент std::list<boost::reference_wrapper<polygonType> > m_children;
Когда объект создается из этого класса, я сохраняю все дочерние элементы этого объекта в качестве ссылки в этой переменной. То, что я хотел сделать, - это когда деструктор объекта вызывается, я хотел, чтобы деструктор детей вызывался.
- Это автоматическое поведение в этом случае? или мне нужно что-то написать для этого, дайте этому списку ссылки?
- Если я хочу, чтобы они не удалялись, что мне нужно делать? Если я хочу, чтобы они удалили, что мне нужно сделать?
Это в основном сводится к некоторым дизайнерским решениям, которые я принял, и как я их исправляю.
c++ virtual-destructor boost-ref
1 ответ
1 Решение Mike Seymour [2013-09-11 18:27:00]
Это автоматическое поведение в этом случае?
Нет. Сохранение 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.