Удаление объекта в пакете boost в С++

0 navderm [2013-09-11 18:13:00]

У меня есть класс, который имеет элемент std::list<boost::reference_wrapper<polygonType> > m_children;

Когда объект создается из этого класса, я сохраняю все дочерние элементы этого объекта в качестве ссылки в этой переменной. То, что я хотел сделать, - это когда деструктор объекта вызывается, я хотел, чтобы деструктор детей вызывался.

  1. Это автоматическое поведение в этом случае? или мне нужно что-то написать для этого, дайте этому списку ссылки?
  2. Если я хочу, чтобы они не удалялись, что мне нужно делать? Если я хочу, чтобы они удалили, что мне нужно сделать?

Это в основном сводится к некоторым дизайнерским решениям, которые я принял, и как я их исправляю.

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.