![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TList, освобождение [D7, Win95/98, WinME, NT4, Win2k, WinXP]
digger © (2004-08-30 11:34:00)Уважаемые участники форума. Вот какой возник вопрос. Когда я добавляю новые элементы в список (TList):
var
p: ^TMyType;
list: TList;
begin
list := TList.Create;
new(p);
list.Add(p);
end;
Если вызвать метод Clear для списка, то освободит ли он память от переменных моего типа или их необходимо освобождать вручную?
Гаврила (2004-08-30 13:09:00) [1]
> DesWind © (30.08.04 12:50) [21]
А что там особо мучиться то... Вроде особых мучений не видно.
DesWind (2004-08-30 12:50:00) [2]Если надо сделать список из TPoint тогда не стоит
DesWind (2004-08-30 12:48:00) [3]>>в том смысле что стоит хранить уже как объекты в TObjectList, >>чтоб мучаться с выделением и освобождением памяти.
VMcL ©
>Зачем? Чтобы юзеру памяти много не казалось?
Ну это уже решать по ходу дела. Все обдумать и взвесить. Стоит это делать или нет.
VMcL (2004-08-30 12:42:00) [4]>> DesWind © (30.08.04 12:36) [17]
Зачем? Чтобы юзеру памяти много не казалось?
DesWind (2004-08-30 12:37:00) [5]точнее не мучиться
DesWind (2004-08-30 12:36:00) [6]Гаврила © (30.08.04 12:25) [14]
в том смысле что стоит хранить уже как объекты в TObjectList, чтоб мучаться с выделением и освобождением памяти.
begin...end (2004-08-30 12:34:00) [7]> [12] DesWind © (30.08.04 12:20)
Что-то я не пойму.
Во-первых, как Вы собираетесь засунуть record в TObjectList?
Во-вторых, Вы полагаете, что TObjectList будет, в случае необходимости, вызывать метод Free для PMyType? Откуда же там возьмётся этот метод?
pasha_golub (2004-08-30 12:33:00) [8]Гаврила © (30.08.04 12:25) [14]
TRecordClass = class
Rec: TRecord;
end;
:0)
Гаврила (2004-08-30 12:25:00) [9]
> Если TMyType это запись и т.п. то имеет смысл хранить в
> TObjectList, для удобочитаемости кода, и простоты.
????
как это запись хранить в TObjectList ???
Суслик (2004-08-30 12:22:00) [10]
> Ega23 © (30.08.04 11:45) [6]
> begin...end © (30.08.04 11:38) [4]
>
> Предпочитаю явно указать. Стиль такой...
правильно делаешь, товарысч.
указывая явно тип ты даешь возможность компилытору построить правильный код, где будет не только освобождена память из под записи, но и проведена корректная файнализация области памяти...
DesWind (2004-08-30 12:20:00) [11]To begin...end © [10]
Если TMyType это запись и т.п. то имеет смысл хранить в TObjectList, для удобочитаемости кода, и простоты.
digger (2004-08-30 12:16:00) [12]Спасибо всем.
begin...end (2004-08-30 12:06:00) [13]> [9] DesWind © (30.08.04 12:03)
Из поста [0] я не вижу, что автор хочет в списке хранить объекты.
DesWind (2004-08-30 12:03:00) [14]А лучше TObjectList меньше проблем он может освобождать может не освобождать в зависимости от Create(true|false)
Ega23 (2004-08-30 11:52:00) [15]Тьфу... Ну все поняли, что PMyType=^TMyType, и что PMyType(Items...)
Опечатка...
VMcL (2004-08-30 11:49:00) [16]>> Ega23 © (30.08.04 11:45) [6]
Он не об этом. Тип неправильный.
Ega23 (2004-08-30 11:45:00) [17]begin...end © (30.08.04 11:38) [4]
Предпочитаю явно указать. Стиль такой...
VMcL (2004-08-30 11:40:00) [18]>> digger © (30.08.04 11:34)
Обычно, в таких случаях пишется наследник TList'а, в котором перекрывается метод Notify. В Notify() при условии, что вид операции - удаление из списка, память, выделенная для элемента, освобождается.
procedure TMyList.Notify(Ptr: Pointer; Operation: ...);
begin
if (Ptr <> nil) and (Operation = lnDeleted) then
// освобождаем память, в твоем случае:
Dispose(PMyType(Ptr));
end;
begin...end (2004-08-30 11:38:00) [19]> [3] Ega23 © (30.08.04 11:36)
> Dispose( TMyType(List.Items[i]);
?
Ega23 (2004-08-30 11:36:00) [20]Сначала надо вручную освободить:
for i:= 0 to List.Count-1 do Dispose(TMyType(List.Items[i]);