Как освободить массив объектов в Delphi Prism? - PullRequest
2 голосов
/ 06 сентября 2011

Мне нужно освободить список объектов, хранящихся в 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?

Спасибо

Ответы [ 3 ]

4 голосов
/ 06 сентября 2011

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

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

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

1 голос
/ 06 сентября 2011

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

Существует также конструкция using, которая немного похожа на Create-try-finally-Свободный конец в Delphi:

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

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

Итак:

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

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

1 голос
/ 06 сентября 2011
while theArrayList.count > 0 do
  theArrayList.RemoveAt(0);

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

...