![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#3
|
|||
|
|||
|
Спасибо, я нашёл в чём дело.
На самом деле, я слегка ввёл в заблуждение уважаемую публику (просто было лень вводить длинный код примера): У меня в программе создаются куча динамических массивов из структур, подобных приведённой: Код:
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 ;
// вот тут то память и не освобождается (и в D7 - тоже, я пробовал).
// а проблема - в непоименованном указателе в процедуре 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 := ''). Только переделывать весь код под классы тоже оченно не хочется - прога то больша-а-а-а-я. Так что, что делать так и не понятно. Спасибо всем, кто откликнулся! |