![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
FreeAndNil
mike_zav © (2007-09-21 17:37:00)В каких случаях применяют FreeAndNil? А в каких просто .Free?
Зачем это нужно? Если можно с примером.
oxffff (2007-09-24 22:29:00) [1]Leonid Troyanovsky © (24.09.07 17:35) [119]
Джо © (24.09.07 20:11) [120]
Конструктивно и выразительно, но непонятно.
Джо (2007-09-24 20:11:00) [2]> [118] Инс © (24.09.07 17:19)
> Так и с FreeAndNil та же история. Нельзя написать
> procedure FreeAndNil(var Obj: TObject);
Да сколько угодно :)
> [119] Leonid Troyanovsky © (24.09.07 17:35)
>
> > Джо © (24.09.07 17:12) [117]
>
> > > Dispose должен быть не Pointer, а типизированный указатель
> >
> > Увы, синтаксис не позволяет.
>
> А почему "увы"? По-моему, да и хрен с ним.
Да по-моему так же.
Leonid Troyanovsky (2007-09-24 17:35:00) [3]
> Джо © (24.09.07 17:12) [117]
> > Dispose должен быть не Pointer, а типизированный указатель
>
> Увы, синтаксис не позволяет.
А почему "увы"? По-моему, да и хрен с ним.
Кому сейчас нужны структуры со стрингами и вариантами.
Т.е., кому нужны - пользуют объекты.
--
Regards, LVT.
Инс (2007-09-24 17:19:00) [4]
> Увы, синтаксис не позволяет.
Так и с FreeAndNil та же история. Нельзя написать
procedure FreeAndNil(var Obj: TObject);
Джо (2007-09-24 17:12:00) [5]> [115] Инс © (24.09.07 16:44)
> Это я г-ну Джо объяснял, почему в парметрах к процедуре
> Dispose должен быть не Pointer, а типизированный указатель
Увы, синтаксис не позволяет.
Anatoly Podgoretsky (2007-09-24 16:51:00) [6]> Инс (24.09.2007 16:44:55) [115]
Это я сейчас не знаю (не помню), но это не относится к тому моменту, когда я захочу использовать.
Инс (2007-09-24 16:44:00) [7]
> Я хорошо знаю, что они умнее и для чего нужны, но что же
> мне делать, если я не использую таких структур, да и память
> уже не помню когда выделял.
Это я г-ну Джо объяснял, почему в парметрах к процедуре Dispose должен быть не Pointer, а типизированный указатель, хотя и вам тоже полезно будет, так как то, что вы хорошо знаете, что они умнее и для чего нужны - я уже сомневаюсь, судя по фразе "Не знаю, давно не использовал Dispose, но по моему должен". А насчет FreeAndNil - что тут обсуждать. Все уже давно сказано, каждый остается при своем. Я вот только понять не могу, почему те, кто не согласен с Borland, до сих пор сидят за Delphi...
oxffff (2007-09-24 16:38:00) [8]
> Anatoly Podgoretsky © (24.09.07 16:36) [113]
> > oxffff (24.09.2007 16:26:51) [111]
>
> Не в ту степь обсуждение пошло, давайте продолжать обсасывать,
> облизывать FreeAndNil или исписались?
oxffff © (24.09.07 15:17) [97]
Anatoly Podgoretsky (2007-09-24 16:36:00) [9]> oxffff (24.09.2007 16:26:51) [111]
Не в ту степь обсуждение пошло, давайте продолжать обсасывать, облизывать FreeAndNil или исписались?
Anatoly Podgoretsky (2007-09-24 16:35:00) [10]> Инс (24.09.2007 16:04:49) [109]
Я хорошо знаю, что они умнее и для чего нужны, но что же мне делать, если я не использую таких структур, да и память уже не помню когда выделял.
oxffff (2007-09-24 16:26:00) [11]
> Тебе же сказали, что все делают ручками.
А при возможности вообще пишут не на ассемблере, а сразу в машинных кодах.
oxffff (2007-09-24 16:16:00) [12]
> Инс © (24.09.07 16:04) [109]
> GetMem/FreeMem - это тупое выделение и освобождение памяти.
> New и Dispose - умнее, они инициализируют и финализируют
> поля финализируемых типов. Если вызвать Dispose и передать
> ей нетипизированный указатель на стуктуру, содержащую такие
> поля, они финализированы не будут. Это очень частая ошибка.
>
Тебе же сказали, что все делают ручками.
FreeMem(pointer(integer(rec^.s)-8))
Typeinfo это вред.
:)
Инс (2007-09-24 16:04:00) [13]GetMem/FreeMem - это тупое выделение и освобождение памяти. New и Dispose - умнее, они инициализируют и финализируют поля финализируемых типов. Если вызвать Dispose и передать ей нетипизированный указатель на стуктуру, содержащую такие поля, они финализированы не будут. Это очень частая ошибка.
Anatoly Podgoretsky (2007-09-24 15:59:00) [14]> Джо (24.09.2007 15:51:45) [105]
Не знаю, давно не использовал Dispose, но по моему должен, это же указатель на структуру или простой тип, а тут речь об объектах.
Разные все таки вещи. Я всегда использую GetMem/FreeMem может крома младенческих лет. Эти функции честные - сказано выделить память и никаких других толкований.
Инс (2007-09-24 15:59:00) [15]
> Джо © (24.09.07 15:51) [105]
Мда...
type
PMyRec = ^TMyRec;
TMyRec = record
s: String;
i: Integer;
end;
....
var
rec: PMyRec;
p: Pointer;
begin
New(rec);
rec^.s:='123';
p:=rec;
Dispose(p);
end;
Ловим утечку памяти из-за того, что память под строку освобождена не будет. А если сделать Dispose(rec) - все будет нормально.
Anatoly Podgoretsky (2007-09-24 15:56:00) [16]> Инс (24.09.2007 15:41:44) [104]
> Примеры поломаных об FreeAndNil копий в студию.
Так выброшены, и копья ломают не из-за пострадавших, они действительно ССЗБ
Ломают над нужностью/не нужностью, из-за названия, из-за политики Борланда, которые во многих случаях пошли по популисткому пути, после Д5.
Я на стороне тех, кто не согласен с Борландом.
Джо (2007-09-24 15:51:00) [17]> [93] Инс © (24.09.07 15:06)
> Раз уж такое дело, то и Dispose использовать вредно. Там ведь
> параметр типа Pointer стоит, который на самом деле таковым быть не
> должен.
Как это «не должен» и почему так?
Инс (2007-09-24 15:41:00) [18]
> Чего тут спорить, с момента появления FreeAndNil ломают
> копья.
А до этого не ломали? Примеры поломаных об FreeAndNil копий в студию. Только не нужно приводить примеры, когда пострадавшие - уже упомянутые выше ССЗБ, они и на ровном месте себе шею сломают.
Anatoly Podgoretsky (2007-09-24 15:38:00) [19]Чего тут спорить, с момента появления FreeAndNil ломают копья.
Разве это недостаточный критерий порочности?
Инс (2007-09-24 15:32:00) [20]
> Борланды в справке всё подробненько расписали, но "не царское
> это дело читать справку" у ССЗБ-н...
Это ты не мне, а [82] объясни.