Освобождение памяти TList<>

antox
Дата: 14.07.2019 09:21:15
Хочу сделать список jpg картинок (с загрузкой из файлов и сохранением в файлы), вроде все норм, но встал вопрос об освобождении памяти

type
  TImg = record
    idb: integer;
    imgno: integer;
    imgj: TJPEGImage;
  end;



procedure myProc();
var
  mg:TImg;
  i: integer;
  imgLst: TList<Timg>;
begin
  imgLst:=TList<TImg>.create;

  for i := 1 to 10 do
    begin
      mg.idb:=1;
      mg.imgno:=i;
      mg.imgj:=TJPEGImage.Create;
      mg.imgj.LoadFromFile('img'+IntToStr(i)+'.jpg');
      imgLst.Add(mg);
    end;

  for mg in imgLst do
    begin
      mg.imgj.SaveToFile('nimg'+IntToStr(mg.imgno)+'.jpg');
    end;

  FreeAndNil(imgLst);
end;


Достаточно ли выполнить
 FreeAndNil(imgLst);
для освобождения памяти?
Dmitri Krizhanovski
Дата: 14.07.2019 10:23:17
antox,

Нет. Нужно на каждый TJPEGImage.Create сделать Free.
X-Cite
Дата: 14.07.2019 11:36:37
Если бы посмотрели в справку по TList

http://docwiki.embarcadero.com/Libraries/Rio/en/System.Generics.Collections.TList

то узнали бы, что "The class TObjectList inherits from TList and provides an automatic mechanism for freeing objects removed from lists."
Vizit0r
Дата: 14.07.2019 13:00:44
X-Cite,

тогдв ему надо будет там не записи хранить, а обьекты, в деструкторе которого освобождать TJPEGImage
antox
Дата: 14.07.2019 13:01:47
А хочется записи
Vizit0r
Дата: 14.07.2019 13:04:31
тогда TList, и вручную правильно прибивать поэлементно.
antox
Дата: 14.07.2019 13:06:36
А если сделать
imgLst: TList<Timg>; глобальной


, а потом после проведения всех операций пробежать пробежать и почистить

for i:=0 to imgLst.count-1 do
  begin
     imgLst.items[i].imgj.free;
  end;

imgLst.free;


Так память будет освобождена? И из idbс imgno тоже?
ziv-2014
Дата: 14.07.2019 14:14:15
antox,
В записях отсутствуют автоматические деструкторы. Обещали ввести в новых версиях.
ёёёёё
Дата: 14.07.2019 14:44:04
antox
А хочется записи

Сделай деструктор автономной функцией, передавай ейуказатель на экземпляр записи, или передавай тлист и индекс записи, вот и все.
white_nigger
Дата: 14.07.2019 16:05:16
А может не засирать мозги себе и другим и всё же использовать классы?