Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

"Освобождение структуры"


race1 ©   (2007-08-03 16:23:00) 

Есть такая структура:
TRec = record
 num: Integer;
 str: String;
end;

И указатель на неё:
PRec = ^TRec;

Я выделяю память:
...
r: PRec;
...
New(r);

И присваиваю значение:
r^.num := 1;
r^.str := 'str';

Как теперь правильно удалить всю выделенную память?

1. Dispose(r);
2. r^.str := '';
 Dispose(r);


Суслик   (2007-08-03 23:02:00) [1]


> race1   (03.08.07 16:46) [5]
> Нашёл багу. У меня список указателей и я в цикле освобождаю
> память:
> for i := 0 to List.Count - 1 do
>  Dispose(List[i]);
>
> Если сделать приведение, то утечка исчезнет:
> for i := 0 to List.Count - 1 do
>  Dispose(PRec(List[i]));
>
> Спасибо вам :)

логично - ибо не знает компилятор на что указывает указатель.


Инс   (2007-08-03 18:57:00) [2]


> А не лучше ли GetMem/FreeMem???

В данном случае - думаю нет. FreeMem не освободит память под строку.


Dib@zol   (2007-08-03 18:44:00) [3]

А не лучше ли GetMem/FreeMem???


AlexWlad   (2007-08-03 18:43:00) [4]

Для строк делай Finalize(r^.str) и будет тебе щастье.


race1   (2007-08-03 16:46:00) [5]

Нашёл багу. У меня список указателей и я в цикле освобождаю память:
for i := 0 to List.Count - 1 do
 Dispose(List[i]);

Если сделать приведение, то утечка исчезнет:
for i := 0 to List.Count - 1 do
 Dispose(PRec(List[i]));

Спасибо вам :)


DVM   (2007-08-03 16:39:00) [6]


> race1  

а у меня не ругается


race1   (2007-08-03 16:35:00) [7]

FastMM4 ругается на утечку памяти... После того как сделал второй вариант, ругаться перестал.


DVM   (2007-08-03 16:32:00) [8]


> race1  

О string компилятор позаботится сам.


Сергей М.   (2007-08-03 16:25:00) [9]

Dispose(r);


Наверх

Титульная страница Поиск, карта сайта Написать письмо