Здравствуйте Иван Ходов, Вы писали:
ИХ>Я сделал упрощенный пример, который моделирует мою проблему. Вот две процедуры, которые реагируют на кнопки на форме. ИХ>Как Вы легко поймете, первая, с каждым новым кликом, создает массив строк, которым присваивает различную длину. ИХ>Вторая должна почистить память. ИХ>Но в результате, если нажимать по такой схеме: ИХ>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) ). А то при выходе указатель созданный на стеке пришибается, а распределенная память не вычищается, ведь автосборщика "мусора" нет!
Безвыходных ситуаций не бывает, это просто такое состояние головного мозга!!!