Форум: "Прочее";
Текущий архив: 2013.04.14;
Скачать: [xml.tar.bz2];
ВнизКак сделать удобный Dispose TList? Найти похожие ветки
← →
dummy_user (2012-12-18 20:14) [0]Каждый раз, когда в TList добавляю новые данные (Через New()),
нужно их очищать.
Нужно ли приводить указатель к указателю типа, на который он был создан?
Если да, то как автоматизировать этот процесс, т.е. не делать каждый раз
такую штуку в виде цикла.
procedure TListEx.Clear;
var
i: LongInt;
begin
For i:= 0 to GetCount - 1 do
Dispose(FItems[i]); // FItems: TList;
FItems.Clear;
end;
← →
Ega23 © (2012-12-18 20:30) [1]TList<TMyRecord>
← →
брат Птибурдукова (2012-12-18 20:32) [2]
> Нужно ли приводить указатель к указателю типа, на который
> он был создан?
Dispose с нетипизированными указателями работать не умеет.
Что ты вообще строишь? Что-то довольно монструозное, судя по последним двум вопросам. Это http://www.gunsmoker.ru/2008/10/x-y-z.html читал?
← →
брат Птибурдукова (2012-12-18 20:33) [3]
> Ega23 © (18.12.12 20:30) [1]
У него делфа седьмая... :-)
← →
RWolf © (2012-12-18 20:39) [4]TObjectList спасёт ОРД.
← →
брат Птибурдукова (2012-12-18 20:41) [5]
> RWolf © (18.12.12 20:39) [4]
С учётом предыдущего вопроса — вероятно, в общем случае — не факт %-)
← →
Sha © (2012-12-18 21:03) [6]> брат Птибурдукова (18.12.12 20:32) [2]
> Dispose с нетипизированными указателями работать не умеет.
???
← →
Sha © (2012-12-18 21:12) [7]> dummy_user (18.12.12 20:14)
Для каждого выделенного куска менеджер памяти помнит его адрес начала и размер.
Тип (или размер) ему был нужен для определения размера при выделении памяти.
При освобождении тип не нужен
← →
Sha © (2012-12-18 21:16) [8]> dummy_user (18.12.12 20:14)
но есть нюанс - финализировать данные придется самостоятельно
← →
dummy_user (2012-12-18 21:22) [9]
> Sha © (18.12.12 21:12) [7]
> При освобождении тип не нужен
> но есть нюанс - финализировать данные придется самостоятельно
Т.е.?
Мой код вызывается в деструкторе.
← →
брат Птибурдукова (2012-12-18 21:26) [10]
> Sha © (18.12.12 21:03) [6]
Ну насколько я помню, с Pointer работали GetMem/FreeMem и требовали указания размера выделяемой/освобождаемой памяти. Второй параметр во FreeMem стал опциональным не так уж давно.
← →
Sha © (2012-12-18 21:33) [11]> dummy_user (18.12.12 21:22) [9]
> брат Птибурдукова (18.12.12 21:26) [10]
Размер освобождаемой памяти менеджер знает не хуже программиста.
Dispose отличается от FreeMem только тем, что финализирует данные.
Вызов Dispose с нетипизированным указателем равносилен FreeMem,
поэтому если по логике приложения надо финализировать,
то надо финализировать руками перед Dispose(pointer).
← →
брат Птибурдукова (2012-12-18 21:39) [12]
> Sha © (18.12.12 21:33) [11]
Если я правильно помню, Д7 (на которой пишет автор) требует во FreeMem вторым параметром указывать размер освобождаемой памяти, параметр обязательный. Почему так? Имхо а) или у менеджера памяти в Д7 не всё гладко в плане освобождения нетипизированных указателей; б) просто "так было раньше" и указание второго параметра роли не играет; в) меня подводит память и седьмой делфи второй параметр FreeMem опциональный.
← →
Sha © (2012-12-18 21:41) [13]> брат Птибурдукова (18.12.12 21:39) [12]
помнишь неправильно, в D7 второй параметр во FreeMem не обязателен,
и если указан, то игнорируется
← →
брат Птибурдукова (2012-12-18 21:42) [14]Ок. Замнём за давностью лет.
← →
Sapersky (2012-12-18 21:43) [15]Я как-то писал TList<TMyRecord> для старых версий. Само собой, это не дженерики, и при обращении к элементу надо тайпкастить. Но по крайней мере, New/Dispose делает автоматически:
http://www.delphimaster.net/view/&folder=59&file=18-1223673497/21
меня подводит память и седьмой делфи второй параметр FreeMem опциональный.
Да, и в 5 тоже. Может, в Турбо-Паскале неопциональный, и то вряд ли.
← →
брат Птибурдукова (2012-12-18 21:47) [16]
> Может, в Турбо-Паскале неопциональный, и то вряд ли
Не-не, в паскале точно неопциональный! :-)
> Само собой, это не дженерики, и при обращении к элементу
> надо тайпкастить
А чего не коллекцию? Зачем всех собак на TList вешать?
← →
Anatoly Podgoretsky © (2012-12-18 22:04) [17]> Sha (18.12.2012 21:12:07) [7]
procedure New(var P: Pointer);
procedure Dispose(var P: Pointer);
← →
Sha © (2012-12-18 22:05) [18]> Anatoly Podgoretsky © (18.12.12 22:04) [17]
и?
← →
ДИСА (2012-12-18 22:28) [19]Dispose( Pmyitemtype( List[I]))
2 A.P. У dispose второй параметр не var .
← →
Anatoly Podgoretsky © (2012-12-18 22:46) [20]
> Sha © (18.12.12 22:05) [18]
Тип (или размер) ему был нужен для определения размера при выделении памяти.
Не наблюдается
← →
Anatoly Podgoretsky © (2012-12-18 22:48) [21]> ДИСА (18.12.2012 22:28:19) [19]
Выписка из справки по Д7
И не второй а первый второго вообще нет
← →
Sha © (2012-12-18 23:01) [22]>> Sha © (18.12.12 22:05) [18]
>> Тип (или размер) ему был нужен для определения размера
>>при выделении памяти.
> Anatoly Podgoretsky © (18.12.12 22:46) [20]
> Не наблюдается
Может, у него телепатия. Или магия? )
← →
Anatoly Podgoretsky © (2012-12-19 13:03) [23]> Sha (18.12.2012 23:01:22) [22]
Не знаю, надо смотреть исходники.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2013.04.14;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.004 c