![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
![]() Всем доброго времени суток!
Кто знает — есть ли какие нибудь средства принудительного освобождения памяти, занимаемой переменной типа 'string'? Проблема такая: Код:
type TTestRec = record Ident: integer ; Name: string ; end; var tr: ^TTestRec ; begin New ( tr ) ; tr^.Name := 'bla-bla-bla' ; ...... Dispose ( tr ) ; в результате исполнения этого замечательного кода в памяти остаётся блок, выделенный для этого самого 'bla-bla-bla'! (Если поле Name не инициализировать, то, естественно, проблем с памятью нет). Вопрос: Кто должен чистить память, выделенную под 'string'? Если никто, то как мне её освободить самому? Что-то я не нашёл, чтобы эта проблема хоть где-нибудь даже обсуждалась... |
#2
|
|||
|
|||
![]() SetLength спасет отца русской демократии.
Однако, лучше пользуйся классами. |
#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 := ''). Только переделывать весь код под классы тоже оченно не хочется - прога то больша-а-а-а-я. Так что, что делать так и не понятно. Спасибо всем, кто откликнулся! |