Главная страница
    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.46 MB
Время: 0.035 c
2-1137926305
Compton's G
2006-01-22 13:38
2006.02.12
Битмап


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


3-1134659444
mpokemonov
2005-12-15 18:10
2006.02.12
Большие буквы в запросе


1-1136800132
M_Alex
2006-01-09 12:48
2006.02.12
как приостановить и возобновить выполение процедуры


3-1134310457
Asail
2005-12-11 17:14
2006.02.12
Событие при прокрутке DBGrid...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский