![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
memory leak
Olexander © (2003-10-12 16:43:00)
Похоже нарвался на субж
Подскажите есть ли тут утечка ?
procedure TPort.ProcessFoundAnswer;
var
PAnswer : ^TAnswer; // некая структура
begin
if (answer_in.Code = command_out.Code) then
case answer_in.Code of
commandUnit.cmdGetADCCodes:
begin
new(PAnswer);
Panswer^ := answer_in;
Inanswerbuff.Add(Panswer); //adding
....
Inanswerbuff : TList
после набора некоторого количества ответов в Inanswerbuff делаю
Inanswerbuff.Clear вне процедуры TPort.ProcessFoundAnswer - хелп говорит что .Clear очищает память занятую под элементы TList.
Так ли это если память я выделил через new для локального указателя PAnswer ??
Спасибо
Olexander (2003-10-13 18:28:00) [1]
> new(PAnswer);
>
> А где Dispose(PAnswer) ?
в смысле так:
new(PAnswer);
Panswer^ := answer_in;
Inanswerbuff.Add(Panswer); //adding
Dispose(PAnswer);
а после этого со списком проблем не будет
если сделать Dispose(PAnswer), и на тот же адрес ссылается Item списка ?
Reindeer Moss Eater (2003-10-13 17:09:00) [2]
new(PAnswer);
А где Dispose(PAnswer) ?
Olexander (2003-10-13 17:04:00) [3]
А если я выделяю память через локальный указатель в процедуре
new(PAnswer);
Panswer^ := answer_in;
Inanswerbuff.Add(Panswer); //adding
А потом вне процедуры очищу все элементы списка
- память освободится корректно ?
Ломброзо (2003-10-12 20:54:00) [4]
В TList хранятся нетипизированные указатели, потому как он будет знать, сколько памяти освобож%дать? Конечно же надо пробежаться руками по всем элементам ТЛиста и явно освободить память, да и притом каждый вызов New должен иметь пару Release. При Clear происходит вызов SetCount(0), из него присходит вызов Delete для всех элементов листа, а Delete просто вызывает Move для элементов массива указателей, но явно память, на которую указывает указатель, нигде в TList не освобождается.