![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
"Освобождение структуры"
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);