Re: Как избавиться от утечки памяти через 'string' в D5?
От: Аноним  
Дата: 03.09.09 12:45
Оценка:
Спасибо, я нашёл в чём дело.

На самом деле, я слегка ввёл в заблуждение уважаемую публику (просто было лень вводить длинный код примера):

У меня в программе создаются куча динамических массивов из структур, подобных приведённой:

  list := TList.Create ;
  for i := 0  to NNN do
  begin
     New ( tr ) ;
     tr^.Name := 'bla-bla-bla' ;
     list.Add ( tr ) ;
  end ;
//
// а после использования такие списки освобождаются универсальной процедурой очистки 
// одноуровневых списков, типа:
  for i := list.Count - 1 do
    Dispose ( list.Items[i] ) ;
  list.Free ;
// вот тут то память и не освобождается.
// а проблема - в непоименованном указателе в процедуре Dispose.    
// Если Dispose указать тип освобождаемой записи, то память, занятая
// под string, освобождается
  for i := list.Count - 1 do
  begin
    tr := list.Items[i] ;  // вот так всё работает 
    Dispose ( tr ) ;       // как надо!
  end ;
  list.Free ;


Сухой остаток печальный: Это что? Каждый динамический список в программе чистить
отдельным кодом?????

Я тут по-быстрому накидал тот-же код, только вместо record'а создал class с полем 'Name: string'.
Загнал их в список, а потом почистил этот список как список потомков общего дельфийского
класса предка TObject. Это работает. В классах пергружаемый деструктор освобождает память поля
string, даже если я в деструкторе своего производного класса не освобождаю её сам (Name := '').

Только переделывать весь код под классы тоже оченно не хочется — прога то больша-а-а-а-я.

Так что, что делать так и не понятно.

Спасибо всем, кто откликнулся!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.