Удаление элементов из индексированного списка в идеале должно выполняться в обратном порядке:
for (int i = ParentPanel->ControlCount - 1; i >= 0; i--)
{
delete ParentPanel->Controls[i];
}
Проблема с подсчетом
Такие списки обычно сдвигают все элементы "выше" (с более высоким индексом)вниз, поэтому если Controls [i] был удален, теперь новый элемент управления перемещается в этот индекс.Но непосредственно после этого индекс увеличивается, так что он указывает на элемент выше того, который заменил удаленный, и только тот, который удален.Таким образом, по сути, удаляется только каждый второй элемент.
Initially: [A] B C D E F G H I J i = 0
Индекс обозначается [ ]
Теперь вы удаляете и таким образом удаляете A, поэтомуновый порядок:
[B] C D E F G H I J i = 0
Но цикл немедленно увеличивает индекс:
B [C] D E F G H I J i++, so i = 1
, поэтому в следующем цикле C удаляется (что означает, что B пропускается).И так далее.Это означает, что удаляется только каждый второй элемент.
Но если вы начинаете сверху, никакие элементы не перемещаются, поэтому все удаляется.
Вызов деструктора
Мне кажетсякрайне плохая идея вызвать деструктора напрямую.Вместо этого используйте delete
.
Компоненты
Обратите внимание, что если вы хотите удалить все компоненты, вы должны использовать список Components
и ComponentCount
.