Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.12;
Скачать: CL | DM;

Вниз

Как правильно освободить память Record   Найти похожие ветки 

 
Senti ©   (2006-01-20 21:00) [0]

У меня есть компонент 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 ?


 
begin...end ©   (2006-01-20 21:15) [1]

> Senti ©   (20.01.06 21:00)

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

Да.

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

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

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

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

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


 
Senti ©   (2006-01-20 21:35) [2]

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

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


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


 
Senti ©   (2006-01-21 04:17) [3]

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


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


> New(Puser);


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


> Puser:=somePointer;


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


> Dispose(PUser);

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


 
msguns ©   (2006-01-21 09:10) [5]

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

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


 
Senti ©   (2006-01-23 09:42) [6]

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


 
Senti ©   (2006-01-23 09:42) [7]

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



Страницы: 1 вся ветка

Текущий архив: 2006.02.12;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.054 c
15-1138195910
Petr V. Abramov
2006-01-25 16:31
2006.02.12
Хочу создать ветку


2-1137861040
JEK2
2006-01-21 19:30
2006.02.12
Настройки программы в файле как?


11-1110491297
Nix
2005-03-11 00:48
2006.02.12
Hints


6-1129916157
Volf_555
2005-10-21 21:35
2006.02.12
Докачка файлов по сети


15-1137653172
Rentgen
2006-01-19 09:46
2006.02.12
Дискретный аналоговый импульсный выход вход