Решил посмотреть, где явно выделяется память. И вот наткнулся на такой кусок кода
- Код: Выделить всё
procedure TMainForm.RemoveCommand(commIndex_: byte);
var i,j:integer;
begin
for i:=0 to CommandCount-1 do
if Commands[i].CommIndex=commIndex_ then break;
if i<CommandCount then
begin
Сommands[i].Destroy; // <--- 1
for j:=i to CommandCount-2 do
Commands[j]:=commands[j+1]; // <--- 2
dec(CommandCount);
setlength(Commands,CommandCount);
end;
end;
Здесь пояснения. Commands - динамический одномерныйц массив класса TCommand (который унаследован от TObject) длиной High(Byte).
В пункте 1 безусловно, надо заменить на Сommands[i].Free;
Алгоритм очень прост. По значению commIndex_ находим нужный нужный нам элемент массива и осовобождаем его.
Затем сдвигаем элементы массива справа налево правее освобожденного.
В результате этого в пункте 2 последний и предпоследний элементы указывают на один и тот же экземпляр класса. Вот этот момент и смущает.
Затем массив обрезается на 1 элемент, последний элемент уходит из зоны видимости.