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

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

Как правильно освободить память Record [D6, WinXP]


Senti ©   (2006-01-20 21:00:00) 

У меня есть компонент TListView. При добавление нового итема к нему добавляется Значение Data.

type
  PUser  = ^AUser;
  AUser  = record
    nick   : ShortString;
    rights : Byte;
    Id : ShortString;
end;

var User     : PUser;
    clname  : TListItem;

// вырезка из кода добавления итема
clname := ListView1.Items.Add;
clname.Caption:='некий юзер';
New(User);
User^.nick:=name;
User^.rights:=adm;
User^.Id:='123';
clname.data :=User;

// теперь необходимо удалить итем и соответственно удалить данные, относящиеся к нему. Я делаю так:
Dispose(ListView1.Items.Item[i].Data);
ListView1.Items.Item[i].Delete;


// Удаляется ли сама запись в этом случае или удаляется только ссылка на нее ?
Необходимо ли делать Dispose в этом случае или его нужно вызывать по другому ? Или когда удаляется итем автоматом очищаются все данные относящиеся к нему ?

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


Senti   (2006-01-23 09:42:00) [1]

Спасибо большое за помощь !


Senti   (2006-01-23 09:42:00) [2]

Спасибо большое за помощь !


msguns   (2006-01-21 09:10:00) [3]

Правильно делать так:

var
 somePointer: PUser;
  ...
begin
  somePointer := New(Puser);
  ...
  Dispose(somePointer);
  ...
end;


DesWind   (2006-01-21 04:40:00) [4]


> New(Puser);


Выделяется область памяти и ее адрес записывается в переменную PUser


> Puser:=somePointer;


Переменной PUser присваивается адрес другой области памяти, при этом теряется адрес другой области, выделенной предыдущей строкой.


> Dispose(PUser);

Особождается память по адресу в перемнной PUser.


Senti   (2006-01-21 04:17:00) [5]

ну вот не знает никто ?


Senti   (2006-01-20 21:35:00) [6]

т.е. в моем случае я правильно удаляю данные. т.е. при вызове Dispose(ListView1.Items.Item[i].Data) удаляется и сами данные PUser созданные в системе ?

А вот другая ситуация. Существует некое кол-во созданных экземпляров PUser в системе.
Мне часть необходимо удалить.
Так ли это делается
New(Puser);
Puser:=somePointer;
Dispose(PUser);


Удалиться ли информация из памяти ?
или есть какие либо другие процедуры для очищения ?


begin...end   (2006-01-20 21:15:00) [7]

> Senti ©   (20.01.06 21:00)

> Необходимо ли делать Dispose в этом случае

Да.

> Или когда удаляется итем автоматом очищаются все данные
> относящиеся к нему ?

Если имеются в виду данные, на которые указывает Data, то нет.

> Как правильно очистить память при удаление item ?

В данном случае (когда запись не содержит полей, подлежащих финализации) Ваш вариант будет корректным. Если же в записи такие поля (например, длинные строки или динамические массивы) будут, то, если они не будут финализироваться Вами вручную, при вызове Dispose необходимо явно указывать тип:

Dispose( PUser(ListView1.Items[i].Data ))


Наверх

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