ликбез, но все же не ясно...
Имеем:
MUS: array of my_class;
x:my_class;
x:=MUS[0];
MUS[0]:=MUS[1];
MUS[1]:=x;
x.free;
если теперь выполнить, например, ShowMessage(MUS[1].text), то будет ошибка, так как было выполнено x.free. Вопрос, как быть в такой ситуации? мне не нужна временная переменна x, но в то же время я хочу, чтобы MUS[1] лежало то, что я туда положил (и вопрос, что я туда таким путем MUS[1]:=x положил).
Ок, но в таком случае:
1. Если я не удалю переменную X, то получается она будет болтаться в памяти (операций таких много=> неприятно получится). Если потом я удалю MUS[0], то что станет с X?
2. Как же все таки удалить X, чтобы не висело в памяти?
Проблема в том, что во время рабюоты приложения эти вещи выполняются, не то что тысячи, а просто 10-ки тысяц раз, не очень хочется делать многие разы x:=MyClass.Create, не уничтодая потом этот самый X
Этого и не надо делать. Переменная x - это просто указатель на один из объектов класса, много памяти она не занимает, сколько бы раз не выполнялся цикл. Вот это строчка x.free; в вашей операции обмена вообще лишняя. Если беспокоитесь о том, что можете обратиться к x после того, как объект на который она указывает уже разрушен, после использования x присвойте ей значение nil. Что-то я не совсем понял, почему вам так хочется уничтожить x.
MUS: array of my_class;
somefunc():;
var
i: ..
x:my_class;
begin
for i:=Low(MUS) to High(MUS) do
MUS := my_class.Create(); //_СОЗДАЮТСЯ_ объекты
x:=MUS[0]; //Дополнительный объект НЕ СОЗДАЕТСЯ. Только ССЫЛКА и то не создается а изменяется
MUS[0]:=MUS[1];
MUS[1]:=x;
//x.free; X - это лишь вторая ССЫЛКА на объект как и MUS[1], уничтожать сам объект по этой ссылке не надо!
end;
//По выходу из области видимости ссылка уничтожается самостоятельно
//не забыть это:
somefunc2():;
i: ..
begin
for i:=Low(MUS) to High(MUS) do
MUS.Free; //_УНИЧТОЖАЮТСЯ_ _ОБЪЕКТЫ_ ПО _ССЫЛКАМ_ MUS
end;
Всё!
Верь мне.
Спасибо, теперь все выяснилось.
P.S. Как хочется в это верить! :)