powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Освобождение памяти TList<>
18 сообщений из 18, страница 1 из 1
Освобождение памяти TList<>
    #39837188
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу сделать список jpg картинок (с загрузкой из файлов и сохранением в файлы), вроде все норм, но встал вопрос об освобождении памяти

Код: pascal
1.
2.
3.
4.
5.
6.
type
  TImg = record
    idb: integer;
    imgno: integer;
    imgj: TJPEGImage;
  end;




Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
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;



Достаточно ли выполнить
Код: pascal
1.
 FreeAndNil(imgLst);

для освобождения памяти?
...
Рейтинг: 0 / 0
Освобождение памяти TList<>
    #39837192
Dmitri Krizhanovski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antox,

Нет. Нужно на каждый TJPEGImage.Create сделать Free .
...
Рейтинг: 0 / 0
Освобождение памяти TList<>
    #39837197
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если бы посмотрели в справку по 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."
...
Рейтинг: 0 / 0
Освобождение памяти TList<>
    #39837210
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite,

тогдв ему надо будет там не записи хранить, а обьекты, в деструкторе которого освобождать TJPEGImage
...
Рейтинг: 0 / 0
Освобождение памяти TList<>
    #39837211
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А хочется записи
...
Рейтинг: 0 / 0
Освобождение памяти TList<>
    #39837212
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тогда TList, и вручную правильно прибивать поэлементно.
...
Рейтинг: 0 / 0
Освобождение памяти TList<>
    #39837213
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если сделать
Код: pascal
1.
imgLst: TList<Timg>; глобальной



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

Код: pascal
1.
2.
3.
4.
5.
6.
for i:=0 to imgLst.count-1 do
  begin
     imgLst.items[i].imgj.free;
  end;

imgLst.free;



Так память будет освобождена? И из idb с imgno тоже?
...
Рейтинг: 0 / 0
Освобождение памяти TList<>
    #39837223
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antox,
В записях отсутствуют автоматические деструкторы. Обещали ввести в новых версиях.
...
Рейтинг: 0 / 0
Освобождение памяти TList<>
    #39837225
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antoxА хочется записи
Сделай деструктор автономной функцией, передавай ейуказатель на экземпляр записи, или передавай тлист и индекс записи, вот и все.
...
Рейтинг: 0 / 0
Освобождение памяти TList<>
    #39837230
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А может не засирать мозги себе и другим и всё же использовать классы?
...
Рейтинг: 0 / 0
Освобождение памяти TList<>
    #39837235
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дарю вариант для записей...

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
type
  ISmartPointer<T: class> = reference to function: T;

  TSmartPointer<T: class> = class(TInterfacedObject, ISmartPointer<T>)
  strict private
    FObject: T;
    function Invoke: T; inline;
  public
    constructor Create(aObject: T);
    destructor Destroy; override;
  end;

{ TSmartPointer<T> }

constructor TSmartPointer<T>.Create(aObject: T);
begin
  FObject := aObject;
end;

destructor TSmartPointer<T>.Destroy;
begin
  FreeAndNil(FObject);
  inherited Destroy();
end;

function TSmartPointer<T>.Invoke: T;
begin
  Exit(FObject);
end;



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
  TImg = record
    idb: integer;
    imgno: integer;
    imgj: ISmartPointer<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:=TSmartPointer<TJPEGImage>.Create(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;
...
Рейтинг: 0 / 0
Освобождение памяти TList<>
    #39837281
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На что только не идут люди из-за любви к проктостоматологии, забывая KISS-принцип... 😁
...
Рейтинг: 0 / 0
Освобождение памяти TList<>
    #39837290
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerНа что только не идут люди из-за любви к проктостоматологии, забывая KISS-принцип... 😁
Ну хочет же он записи.. Пока нет управляемых финализаторов, только так...
А там пусть думает что уже лучше... :)
...
Рейтинг: 0 / 0
Освобождение памяти TList<>
    #39837320
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-CiteПока нет управляемых финализаторов, только так...
Будто напрямую к полю обратиться нельзя...
Код: pascal
1.
imgLst.items[i].imgj.free;
...
Рейтинг: 0 / 0
Освобождение памяти TList<>
    #39837329
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что мешает переопределить TList.Notify() и делать там с элементами что душе угодно?..
...
Рейтинг: 0 / 0
Освобождение памяти TList<>
    #39837369
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyX-CiteПока нет управляемых финализаторов, только так...
Будто напрямую к полю обратиться нельзя...
Код: pascal
1.
imgLst.items[i].imgj.free;



Так пойдет ))
...
Рейтинг: 0 / 0
Освобождение памяти TList<>
    #39837381
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antoxТак пойдет ))
Тогда ещё вместо "items" используй "list" ;)
...
Рейтинг: 0 / 0
Освобождение памяти TList<>
    #39837507
antox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Не, эт уже перебор )
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Освобождение памяти TList<>
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]