Как освободить массив объектов в призме Delphi?

Мне нужно освободить список объектов, хранящихся в ArrayList. Я знаю, что вы можете вызвать бесплатную процедуру в Delphi, но в Delphi Prism нет бесплатной процедуры. Я хочу не просто удалить объекты из списка, но и освободить его из памяти.

Например, скажем, у меня есть следующий класс

TheClass = Class
 private
 theStr:String;
 protected
 public
end;

method TheForm;
begin
 TheArrayList:=new ArrayList;
end;

Чтобы добавить объект, я бы сделал это:

method TheForm.AddToList;
var
 tmpObj:TheClass;
begin
 tmpObj := new TheClass;
 TheArrayList.Add(tmpObj);
end;

Чтобы удалить объект из списка, я бы сделал это так, но бесплатной процедуры нет.

method TheForm.DeleteFromList;
var I:integer;
begin
 for I:=0 to theArrayList.count-1 do
 begin
  theClass(theArrayList[I]).free;     <-------I know this doesnt work.
  theArrayList.RemoveAt(I);
 end;
end;
end;

Как выполняется освобождение списка объектов в Delphi Prism?

Спасибо,


person ThN    schedule 06.09.2011    source источник
comment
Это .net с его сборщиком мусора. Просто позвольте ему решить, когда отпустить воспоминание.   -  person David Heffernan    schedule 06.09.2011
comment
@ Дэвид, хорошо. Но что, если возникает ситуация, когда вам нужно принудительно освободить объект, а не ждать сборщика мусора.   -  person ThN    schedule 06.09.2011


Ответы (3)


Поскольку ваш класс не удерживает какие-либо неуправляемые ресурсы, такие как файлы, дескрипторы окон, соединения с базой данных и т. Д., Вам ничего не нужно делать, кроме как позволить сборщику мусора .net освободить память, когда он решит, что время подходящее.

Попытка принудительно запустить сборщик мусора раньше времени обычно приводит к худшей производительности, чем просто позволить ему выполнять свою работу.

Если у вас был класс с неуправляемыми ресурсами, вам следует следовать шаблону IDisposable.

person David Heffernan    schedule 06.09.2011

while theArrayList.count > 0 do
  theArrayList.RemoveAt(0);

GC вам поможет.

person TheHorse    schedule 06.09.2011

Программы Delphi Prism работают на .NET. Нет необходимости освобождать какие-либо объекты, поскольку сборщик мусора в конечном итоге сделает это. Как кто-то уже прокомментировал, вы можете вызвать IDisposable.Dispose (), чтобы освободить другие ресурсы, кроме памяти, если объект реализует это.

Также существует конструкция using, которая немного похожа на Create-try-finally-Free-end в Delphi:

using MyArrayList = new ArrayList do
begin
  // use ArrayList...
end; // IDisposable(ArrayList).Dispose is called, if applicable.

Конечно, это не сработает для элементов в массиве. Если вы действительно хотите, вы можете вызвать Dispose для каждого из них. Но, как правило, в этом нет необходимости.

So:

method TheForm.DeleteFromList;
begin
  theArrayList.Clear;
end;

Не нужно ничего освобождать.

person Rudy Velthuis    schedule 06.09.2011