Текущий архив: 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