Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.02.12;
Скачать: [xml.tar.bz2];

Вниз

Как правильно освободить память 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.041 c
4-1133045302
Volf_555
2005-11-27 01:48
2006.02.12
Как завершить процесс, зная откуда он запущен?


15-1137339360
Piter
2006-01-15 18:36
2006.02.12
Я плакал :)) А это правда?


3-1134387258
Wolferio
2005-12-12 14:34
2006.02.12
Управление базами


3-1134745044
kazar
2005-12-16 17:57
2006.02.12
копирование таблиц


15-1138081406
wHammer
2006-01-24 08:43
2006.02.12
Большие целые числа (Delphi 5)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский