Текущий архив: 2004.09.12;
Скачать: CL | DM;
Вниз
TList, освобождение Найти похожие ветки
← →
digger © (2004-08-30 11:34) [0]Уважаемые участники форума. Вот какой возник вопрос. Когда я добавляю новые элементы в список (TList):
var
p: ^TMyType;
list: TList;
begin
list := TList.Create;
new(p);
list.Add(p);
end;
Если вызвать метод Clear для списка, то освободит ли он память от переменных моего типа или их необходимо освобождать вручную?
← →
MU © (2004-08-30 11:35) [1]необходимо освобождать вручную
← →
begin...end © (2004-08-30 11:36) [2]Не освободит. Вручную.
← →
Ega23 © (2004-08-30 11:36) [3]Сначала надо вручную освободить:
for i:= 0 to List.Count-1 do Dispose(TMyType(List.Items[i]);
← →
begin...end © (2004-08-30 11:38) [4]> [3] Ega23 © (30.08.04 11:36)
> Dispose(TMyType(List.Items[i]);
?
← →
VMcL © (2004-08-30 11:40) [5]>>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;
← →
Ega23 © (2004-08-30 11:45) [6]begin...end © (30.08.04 11:38) [4]
Предпочитаю явно указать. Стиль такой...
← →
VMcL © (2004-08-30 11:49) [7]>>Ega23 © (30.08.04 11:45) [6]
Он не об этом. Тип неправильный.
← →
Ega23 © (2004-08-30 11:52) [8]Тьфу... Ну все поняли, что PMyType=^TMyType, и что PMyType(Items...)
Опечатка...
← →
DesWind © (2004-08-30 12:03) [9]А лучше TObjectList меньше проблем он может освобождать может не освобождать в зависимости от Create(true|false)
← →
begin...end © (2004-08-30 12:06) [10]> [9] DesWind © (30.08.04 12:03)
Из поста [0] я не вижу, что автор хочет в списке хранить объекты.
← →
digger © (2004-08-30 12:16) [11]Спасибо всем.
← →
DesWind © (2004-08-30 12:20) [12]To begin...end © [10]
Если TMyType это запись и т.п. то имеет смысл хранить в TObjectList, для удобочитаемости кода, и простоты.
← →
Суслик © (2004-08-30 12:22) [13]
> Ega23 © (30.08.04 11:45) [6]
> begin...end © (30.08.04 11:38) [4]
>
> Предпочитаю явно указать. Стиль такой...
правильно делаешь, товарысч.
указывая явно тип ты даешь возможность компилытору построить правильный код, где будет не только освобождена память из под записи, но и проведена корректная файнализация области памяти...
← →
Гаврила © (2004-08-30 12:25) [14]
> Если TMyType это запись и т.п. то имеет смысл хранить в
> TObjectList, для удобочитаемости кода, и простоты.
????
как это запись хранить в TObjectList ???
← →
pasha_golub © (2004-08-30 12:33) [15]Гаврила © (30.08.04 12:25) [14]
TRecordClass = class
Rec: TRecord;
end;
:0)
← →
begin...end © (2004-08-30 12:34) [16]> [12] DesWind © (30.08.04 12:20)
Что-то я не пойму.
Во-первых, как Вы собираетесь засунуть record в TObjectList?
Во-вторых, Вы полагаете, что TObjectList будет, в случае необходимости, вызывать метод Free для PMyType? Откуда же там возьмётся этот метод?
← →
DesWind © (2004-08-30 12:36) [17]Гаврила © (30.08.04 12:25) [14]
в том смысле что стоит хранить уже как объекты в TObjectList, чтоб мучаться с выделением и освобождением памяти.
← →
DesWind © (2004-08-30 12:37) [18]точнее не мучиться
← →
VMcL © (2004-08-30 12:42) [19]>>DesWind © (30.08.04 12:36) [17]
Зачем? Чтобы юзеру памяти много не казалось?
← →
DesWind © (2004-08-30 12:48) [20]>>в том смысле что стоит хранить уже как объекты в TObjectList, >>чтоб мучаться с выделением и освобождением памяти.
VMcL ©
>Зачем? Чтобы юзеру памяти много не казалось?
Ну это уже решать по ходу дела. Все обдумать и взвесить. Стоит это делать или нет.
← →
DesWind © (2004-08-30 12:50) [21]Если надо сделать список из TPoint тогда не стоит
← →
Гаврила © (2004-08-30 13:09) [22]
> DesWind © (30.08.04 12:50) [21]
А что там особо мучиться то... Вроде особых мучений не видно.
Страницы: 1 вся ветка
Текущий архив: 2004.09.12;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.025 c