Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.04.14;
Скачать: CL | DM;

Вниз

Как сделать удобный 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.012 c
15-1355913207
Дмитрий С
2012-12-19 14:33
2013.04.14
Открыть файл от имени администратора.


15-1355701626
RGV
2012-12-17 03:47
2013.04.14
Посоветуйте как поступить


15-1355949002
Юрий
2012-12-20 00:30
2013.04.14
С днем рождения ! 20 декабря 2012 четверг


3-1288195610
venator
2010-10-27 20:06
2013.04.14
Direct oracle access - помогите разобраться с ошибкой


15-1355208502
alexdn
2012-12-11 10:48
2013.04.14
Пхп