element::~element()
{
typedef std::vector<element*>::const_iterator iterator;
for (iterator it(_elements.begin()); it != _elements.end(); ++it)
delete *it;
}
delete this
в деструкторе всегда неверен: this
уже уничтожается!
Кроме того, вам нужно будет объявить конструктор копирования и оператор присваивания копии (либо оставив их неопределенными, либо не копируя свой класс, либо предоставив подходящее определение, которое копирует дерево).
В качестве альтернативы (и предпочтительно) вы должны использовать контейнер умных указателей для _elements
. Например.,
std::vector<std::unique_ptr<element>> _elements;
Когда element
уничтожен, его контейнер _elements
будет автоматически уничтожен. Когда контейнер уничтожен, он уничтожит каждый из его элементов. std::unique_ptr
владеет объектом, на который он указывает, и когда std::unique_ptr
будет уничтожен, он уничтожит элемент, на который он указывает.
Используя std::vector<std::unique_ptr<element>>
здесь, вам не нужно предоставлять свой собственный деструктор, потому что все эти встроенные функции позаботятся о вашей очистке.
Если вы хотите иметь возможность копировать дерево element
, вам все равно придется предоставить свой собственный конструктор копирования и оператор назначения копирования, который клонирует дерево. Однако если вам не нужно, чтобы дерево было копируемым, вам не нужно объявлять операции копирования, как вы это делаете, если сами управляете памятью: контейнер std::unique_ptr
сам по себе не копируется, поэтому его присутствие в качестве члена переменная будет подавлять неявно сгенерированные операции копирования.