Прежде всего, вы не должны вызывать деструктор объектов напрямую, если только вы не пишете распределитель и не используете новое размещение при его создании.Во-вторых, вы должны delete
, а не delete[]
, если вы также не использовали new[]
.И, наконец, delete this
- вредная привычка, но легальная в соответствии со стандартом.Почему бы вам просто не позвонить delete theNode
вместо всего этого?
РЕДАКТИРОВАТЬ: адресовать некоторые комментарии / дополнительные вопросы.
Чтобы выделить один экземпляр в куче, вы используете theNode = new Node
,Возвращенный указатель должен быть освобожден с помощью delete theNode
.Вызов new выделит память, а затем вызовет Node::Node()
, конструктор, чтобы он мог установить свое внутреннее состояние.Вызов delete удалит Node::~Node()
, а затем освободит выделенную память.Деструктор отвечает за очистку всего, что использует Node, но не памяти, используемой самим Node.
Чтобы выделить массив узлов, вы используете theNodes = new Node[10];
.Вы удаляете их с помощью delete[] theNodes
.Смешивать new / delete с new [] / delete [] - неопределенное поведение.
Размещение new - это метод, в котором вы хотите создать объект в уже выделенной памяти .В этом случае у вас есть единственная веская причина для непосредственного вызова деструктора: вы хотите деконструировать объект (он же позволяет ему очиститься) без , а также освобождает выделенную для него память.
Вызов delete this
допустим, например, для функции Suicide()
, если вы не ссылаетесь на «this» или любых членов удаленного экземпляра после вызова delete this
.Это правильная методика, например, для объектов с подсчетом ссылок, но часто считается чем-то, чего вам следует избегать, если вам это действительно не нужно.
Правильное решение для вас довольно простое, когда вы сейчас вызываете ~Node
, простоdelete theNode
вместо.