Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TList и расход памяти, Как правильно очистить записи в TList? 
:(
    Опции темы
Гость_Alexander
Дата 20.11.2004, 19:23 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Народ, как правильно очистить запись/все записи в TList? Проблема в том что выделяя память инструкцией New для очередной записи в TList, после выполнения инструкции List.Delete(n)или List.Clear память, выделенная под записи, не высвобождается… Например попробуйте кусок кода и запустите диспетчер задач, обратите внимание на расход памяти… Или может я чего-то не понимаю? smile

Type Rtest=Record
a:Array[0..1024*10] of byte;
end;
PTest=^Rtest;

procedure TForm1.Timer1Timer(Sender: TObject);
var test:PTest;
begin
New(Test);
List.Add(Test);
List.Clear;
end;
  Вверх
_hunter
Дата 20.11.2004, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



а с чего бы ей освобождаться?
Clear() только внутри компонента память чистит. а все самим-собой выделенное и чистить самому нужно


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Zero
Дата 20.11.2004, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: 8
Всего: 24



Гость_Alexander, для очистки динамической памяти используй процедуру: Dispose.
Пример:
Код

var
 i:^integer;
Begin
 //Выделение памяти
 New(i);
 ......
 //Работа с идентификаторами для которых она выделена
 i^:=2;
 Label1.Caption:=IntToStr(i^);
 ......
 //Освобождение памяти
 Dispose(i)
End;

Аналогично и ствоим примером.

Это сообщение отредактировал(а) Zero - 20.11.2004, 21:46
PM MAIL ICQ   Вверх
Guest
Дата 21.11.2004, 13:44 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Что то, коллеги, ничего не получается. Вот кусок из реальной программы. Память рассходуется со скоростью звука smile не помагает ни Finalize, ни Dispose. Где глюк?

Type RNetFile=record
UserName,
FileName:WideString;
FileNameID:DWord;
StatusOpen:DWord;
TimeBegin,TimeEnd:TDateTime;
end;
PNetFile=^RNetFile;

Procedure TForm1.Clear;
begin
While List.Count<>0 do begin
Finalize(List.Items[List.Count-1]^);
Dispose(List.Items[List.Count-1]);
List.Delete(List.Count-1);
end;

  Вверх
Гость_Alexander
Дата 21.11.2004, 13:46 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Забыл кусок...

procedure TForm1.Timer1Timer(Sender: TObject);
var test:PNetFIle;
r:integer;
begin
for r:=1 to 100 do begin
New(Test);
Test^.UserName:='?????????????';
Test^.FileName:='C:\Download.html';
Test^.FileNameID:=34;
Test^.StatusOpen:=99;
List.Add(Test);
end;
Clear;
end;

  Вверх
Zero
Дата 21.11.2004, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: 8
Всего: 24



Короче, я пока не проверял твою прогу, но сразу могу сказать замечание по поводу указания типов: Если, ты какому-нибудь идентификатору присваеваеш тип указатель, то эту строку надо писать до создания самого типа на который указывает указатель а не после.
Поэтому, попробуй написать так:
Код

type
 PNetFile=^RNetFile;
 RNetFile=record
   UserName,FileName:WideString;
   FileNameID:DWord;
   StatusOpen:DWord;
   TimeBegin,TimeEnd:TDateTime;
 end;
...

А так как ты выслал кусок проги, то я по нему немогу, нормально сорентироватся, поэтому над остальным участком попробуй сам подумать, если не получится то пиши...
PM MAIL ICQ   Вверх
Гость_Alexander
Дата 21.11.2004, 21:26 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Чуствую что для компилятора это значения не имеет (Шустрый). А вот что люди добрые подсказали, может кому нибудь интересно будет и познавательно... Всем спасибо и огромный respect... И так сточку:

Finalize(List.Items[List.Count-1]^);
Dispose(List.Items[List.Count-1]);

необходимо заменить на:

Dispose(PNetFIle(List.Items[List.Count-1]));

А это так, мысли в слух, не ужели никто не встречался с такой проблемой, не уж то ни кто не следит за расходом памяти?


-------------------------------------------

Все гениальноее ну очень просто smile

  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0680 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.