| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > TList и расход памяти |
| Автор: Гость_Alexander 20.11.2004, 19:23 |
| Народ, как правильно очистить запись/все записи в TList? Проблема в том что выделяя память инструкцией New для очередной записи в TList, после выполнения инструкции List.Delete(n)или List.Clear память, выделенная под записи, не высвобождается… Например попробуйте кусок кода и запустите диспетчер задач, обратите внимание на расход памяти… Или может я чего-то не понимаю? 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 |
| а с чего бы ей освобождаться? Clear() только внутри компонента память чистит. а все самим-собой выделенное и чистить самому нужно |
| Автор: Zero 20.11.2004, 21:45 | ||
| Гость_Alexander, для очистки динамической памяти используй процедуру: Dispose. Пример:
Аналогично и ствоим примером. |
| Автор: Guest 21.11.2004, 13:44 |
| Что то, коллеги, ничего не получается. Вот кусок из реальной программы. Память рассходуется со скоростью звука 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 |
| Забыл кусок... 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 | ||
| Короче, я пока не проверял твою прогу, но сразу могу сказать замечание по поводу указания типов: Если, ты какому-нибудь идентификатору присваеваеш тип указатель, то эту строку надо писать до создания самого типа на который указывает указатель а не после. Поэтому, попробуй написать так:
А так как ты выслал кусок проги, то я по нему немогу, нормально сорентироватся, поэтому над остальным участком попробуй сам подумать, если не получится то пиши... |
| Автор: Гость_Alexander 21.11.2004, 21:26 |
| Чуствую что для компилятора это значения не имеет (Шустрый). А вот что люди добрые подсказали, может кому нибудь интересно будет и познавательно... Всем спасибо и огромный respect... И так сточку: Finalize(List.Items[List.Count-1]^); Dispose(List.Items[List.Count-1]); необходимо заменить на: Dispose(PNetFIle(List.Items[List.Count-1])); А это так, мысли в слух, не ужели никто не встречался с такой проблемой, не уж то ни кто не следит за расходом памяти? ------------------------------------------- Все гениальноее ну очень просто |