Re: Люди!!! Ткните мне, пожалуйста, пальцем в утечку!!
От: AIR Россия  
Дата: 08.04.02 04:21
Оценка:
Здравствуйте Иван Ходов, Вы писали:

ИХ>Я сделал упрощенный пример, который моделирует мою проблему. Вот две процедуры, которые реагируют на кнопки на форме.

ИХ>Как Вы легко поймете, первая, с каждым новым кликом, создает массив строк, которым присваивает различную длину.
ИХ>Вторая должна почистить память.
ИХ>Но в результате, если нажимать по такой схеме:
ИХ>12
ИХ>112
ИХ>1112
ИХ>11112
ИХ>и т.д., т.е. 1-ю кнопку нажимать все больше раз, то происходит все большая утечка памяти примерно по 4-8 Kb.

ИХ>Расскажите, пожалуйста в чем дело?!?!?!?


ИХ>type

ИХ> ptry1=^ttry1;
ИХ> ttry1=array[1..4096] of string;

ИХ>TForm1 = class(TForm)

ИХ> Button1: TButton;
ИХ> Button2: TButton;
ИХ> procedure Button1Click(Sender: TObject);
ИХ> procedure Button2Click(Sender: TObject);
ИХ> private
ИХ> { Private declarations }
ИХ> public
ИХ> t : array of ptry1;
ИХ> { Public declarations }
ИХ> end;


ИХ>procedure TForm1.Button1Click(Sender: TObject);

ИХ>var
ИХ>p : ptry1;
ИХ>i : longint;
ИХ>s : String;

ИХ>begin

ИХ>new(p);
ИХ>for i:=1 to 4096 do
ИХ> Begin
ИХ> setlength(s,i);
ИХ> p^[i] := s;
ИХ> setlength(s,0);
ИХ> End;
ИХ>i := length(t);
ИХ>setlength(t, i+1);
ИХ>t[i] := p;
ИХ>end;

ИХ>procedure TForm1.Button2Click(Sender: TObject);

ИХ>var
ИХ>i,j: longint;
ИХ>begin
ИХ>for i := 0 to length(t)-1 do
ИХ> Begin
ИХ> for j := 1 to 4096 do
ИХ> setlength(t[i]^[j],0);
ИХ> dispose(t[i]);
ИХ> End;
ИХ>t:=nil;
ИХ>end;

ИХ>там реальный код сложнее. Этот — просто макет, который производит ту же утечку, что и реальная прога.


ИХ>Я знаю, что если в первой процедуре на использовать s, а сразу устанавливать длину для элементов массива, то утечки нету. Так в чем проблема? кто знает?

Может я и не прав, но мне кажется следующее. Если все есть так, как ты написал в самом конце пояснения, то у тебя при выходе из первой процедуры не вычищается кусок, ассоциированный с p ( new(p) ). Раз уж ты выделил его сам, то сам и зашибай!!!! ( delete(p) ). А то при выходе указатель созданный на стеке пришибается, а распределенная память не вычищается, ведь автосборщика "мусора" нет!
Безвыходных ситуаций не бывает, это просто такое состояние головного мозга!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.