Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 03.09.2009, 13:10
fimonti fimonti вне форума
Прохожий
 
Регистрация: 20.11.2008
Сообщения: 7
Репутация: 10
По умолчанию Как избавиться от утечки памяти через 'string' в D5?

Всем доброго времени суток!

Кто знает — есть ли какие нибудь средства принудительного освобождения памяти,
занимаемой переменной типа '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  
Старый 03.09.2009, 15:08
lmikle lmikle сейчас на форуме
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

SetLength спасет отца русской демократии.
Однако, лучше пользуйся классами.
Ответить с цитированием
  #3  
Старый 03.09.2009, 16:41
fimonti fimonti вне форума
Прохожий
 
Регистрация: 20.11.2008
Сообщения: 7
Репутация: 10
По умолчанию

Спасибо, я нашёл в чём дело.

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

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

Код:
  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 := '').

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

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

Спасибо всем, кто откликнулся!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:15.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025