Главная страница
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.037 c
15-1137592139
Харько
2006-01-18 16:48
2006.02.12
Российские депутаты хотят вернуться к старому стилю


6-1131363336
vladraven
2005-11-07 14:35
2006.02.12
В случае закрытого порта выдает ошибку ( connection timed out )


3-1134726170
Dmitriy G.
2005-12-16 12:42
2006.02.12
Получение имение поля из запроса


1-1136848666
КодеКорешь
2006-01-10 02:17
2006.02.12
Координаты выделенной строки DBGrid относительно самого грида


5-1124975647
Aleksandr.
2005-08-25 17:14
2006.02.12
Что сделать с некорректной отрисовкой TCustomListBox?