виртуальный деструктор — удаление объекта в надстройке надстройки в переполнении стека

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

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

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

Это в основном сводится к некоторым проектным решениям, которые я принял, и к тому, как я хочу их исправить.

0

Решение

Это автоматическое поведение в этом случае?

Хранение 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; или возможно Контейнер повышения указателя.

1

Другие решения

Других решений пока нет …