Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
4-1264583204
GanibalLector
2010-01-27 12:06
2013.04.14
Проверка создания дополнительного потока.


2-1349695018
aka
2012-10-08 15:16
2013.04.14
SSH cryptlib, кто работал с этим?


15-1355833435
Труп Васи Доброго
2012-12-18 16:23
2013.04.14
Колбасный шприц


15-1355847254
dummy_user
2012-12-18 20:14
2013.04.14
Как сделать удобный Dispose TList?


2-1349547213
Valentin1111111
2012-10-06 22:13
2013.04.14
Множества дельфи





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский