Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Освобождение памяти TList<> / 18 сообщений из 18, страница 1 из 1
14.07.2019, 09:21
    #39837188
antox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TList<>
Хочу сделать список 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
14.07.2019, 10:23
    #39837192
Dmitri Krizhanovski
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TList<>
antox,

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

тогдв ему надо будет там не записи хранить, а обьекты, в деструкторе которого освобождать TJPEGImage
...
Рейтинг: 0 / 0
14.07.2019, 13:01
    #39837211
antox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TList<>
А хочется записи
...
Рейтинг: 0 / 0
14.07.2019, 13:04
    #39837212
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TList<>
тогда TList, и вручную правильно прибивать поэлементно.
...
Рейтинг: 0 / 0
14.07.2019, 13:06
    #39837213
antox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TList<>
А если сделать
Код: 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
14.07.2019, 14:14
    #39837223
ziv-2014
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TList<>
antox,
В записях отсутствуют автоматические деструкторы. Обещали ввести в новых версиях.
...
Рейтинг: 0 / 0
14.07.2019, 14:44
    #39837225
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TList<>
antoxА хочется записи
Сделай деструктор автономной функцией, передавай ейуказатель на экземпляр записи, или передавай тлист и индекс записи, вот и все.
...
Рейтинг: 0 / 0
14.07.2019, 16:05
    #39837230
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TList<>
А может не засирать мозги себе и другим и всё же использовать классы?
...
Рейтинг: 0 / 0
14.07.2019, 16:53
    #39837235
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TList<>
Дарю вариант для записей...

Код: 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
15.07.2019, 00:18
    #39837281
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TList<>
На что только не идут люди из-за любви к проктостоматологии, забывая KISS-принцип... 😁
...
Рейтинг: 0 / 0
15.07.2019, 03:12
    #39837290
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TList<>
white_niggerНа что только не идут люди из-за любви к проктостоматологии, забывая KISS-принцип... 😁
Ну хочет же он записи.. Пока нет управляемых финализаторов, только так...
А там пусть думает что уже лучше... :)
...
Рейтинг: 0 / 0
15.07.2019, 09:10
    #39837320
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TList<>
X-CiteПока нет управляемых финализаторов, только так...
Будто напрямую к полю обратиться нельзя...
Код: pascal
1.
imgLst.items[i].imgj.free;
...
Рейтинг: 0 / 0
15.07.2019, 10:00
    #39837329
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TList<>
Что мешает переопределить TList.Notify() и делать там с элементами что душе угодно?..
...
Рейтинг: 0 / 0
15.07.2019, 11:28
    #39837369
antox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Освобождение памяти TList<>
Kazantsev AlexeyX-CiteПока нет управляемых финализаторов, только так...
Будто напрямую к полю обратиться нельзя...
Код: pascal
1.
imgLst.items[i].imgj.free;



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

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


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