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

Вниз

FreeAndNil   Найти похожие ветки 

 
Игорь Шевченко ©   (2007-09-24 13:04) [80]

Borland же честно подписал "Be careful to only pass TObjects to this routine." :)


 
Anatoly Podgoretsky ©   (2007-09-24 13:04) [81]

Откомпилируется, не в таком конец виде, это же шаблон

var
  I: Integer;
begin
  I := 0;
  FreeAndNil(I);


 
Anatoly Podgoretsky ©   (2007-09-24 13:14) [82]

> Игорь Шевченко  (24.09.2007 13:04:20)  [80]

В гробу такую честность.


 
Инс ©   (2007-09-24 13:24) [83]


> Функция FreeAndNil сравни функии IncDay

IncDay - хорошая функция. Позволяет не привязываться к реализации типа TDateTime, а заодно делает код более читаемым, особенно если в нем интенсивно используются подобные IncXXX-функции.


 
Turbouser ©   (2007-09-24 13:30) [84]

> [83] Инс ©   (24.09.07 13:24)
> IncDay — хорошая функция.

=))) Был тут энтузиаст :)
Свой  incday изобрел — у EGA23 до сих пор наверное
на стене висит — бо настроение поднимать :)))


 
Leonid Troyanovsky ©   (2007-09-24 13:32) [85]


> oxffff ©   (24.09.07 12:12) [77]

Согласен с Анатолием.

Хорошо б еще не забывать,
что ссылка может быть не единственной.

--
Regards, LVT.


 
Anatoly Podgoretsky ©   (2007-09-24 13:56) [86]

> Leonid Troyanovsky  (24.09.2007 13:32:25)  [85]

Правильно не надо закладываться на повторное использование переменных.
Просто надо решать надо иначе, через защищенное поле и контролируемое свойство и волосы будут шелковистыми.
Это решение дешевле, чем искать проблемы, героически с ними бороться.
А основная претензия к функции, что параметр не типизированый, со всем вытекающим из этого.


 
oxffff ©   (2007-09-24 14:41) [87]


> А основная претензия к функции, что параметр не типизированый,
>  со всем вытекающим из этого.


Так сделали они это по известным причинам, на которые вы намекали выше.
А именно, чтобы использовать в качестве параметра, любой ссылочный тип в основном Tobject и pointer. Но поскольку они не совместимы, если их передавать как var.

Им достаточно было сделать то, что я предлагаю, а именно сделать неявное приведение для ccылочных типов с простой семантикой копирования переданных как var параметр. И было бы счастье и удобство.


 
Инс ©   (2007-09-24 14:46) [88]


> Anatoly Podgoretsky ©   (24.09.07 13:04) [81]

Что, неужели вы в своих проектах так и делали?


 
Anatoly Podgoretsky ©   (2007-09-24 14:58) [89]

> oxffff  (24.09.2007 14:41:27)  [87]

Ну причины мы разобрали, а вот претензии остались.
Правда никто и не заставляет это использовать.
Счастье то будет в количестве строк и дополнительном геморое. Вот если они сделают это на уровне языка, тогда другое дело, только нафиг оно нужно. Пусть программист несет ответственность за свои действия.


 
Anatoly Podgoretsky ©   (2007-09-24 15:00) [90]


> Что, неужели вы в своих проектах так и делали?

Конечно нет, это же демонстрация. Да и как бы я мог это сделать, если я не использую FreeAndNil


 
Leonid Troyanovsky ©   (2007-09-24 15:02) [91]


> Anatoly Podgoretsky ©   (24.09.07 13:56) [86]

> Просто надо решать надо иначе, через защищенное поле и контролируемое
> свойство

Я даже предлагал как-то пример подобного

http://groups.google.com/group/fido7.ru.delphi.chainik/msg/2af895b1f348cbd1?dmode=source&output=gplain

--
Regards, LVT.


 
oxffff ©   (2007-09-24 15:03) [92]


> Вот если они сделают это на уровне языка, тогда другое дело,
>  только нафиг оно нужно


Так я именно об этом. :)


 
Инс ©   (2007-09-24 15:06) [93]


> Конечно нет, это же демонстрация. Да и как бы я мог это
> сделать, если я не использую FreeAndNil

Насколько я понял, вы не используете именно потому, что боитесь так сделать. Странная у вас позиция, ну не нравится вам, и не пользуйтесь. Какой тут геморой может быть, кроме того надуманного, что вы привели, я не знаю. Раз уж такое дело, то и Dispose использовать вредно. Там ведь параметр типа Pointer стоит, который на самом деле таковым быть не должен.


 
Anatoly Podgoretsky ©   (2007-09-24 15:08) [94]

> Leonid Troyanovsky  (24.09.2007 15:02:31)  [91]

Так это решение вполне квалифицированое, в рамках идеологии ООП Дельфи.


 
Anatoly Podgoretsky ©   (2007-09-24 15:09) [95]

> oxffff  (24.09.2007 15:03:32)  [92]

Ты об нафиг оно нужно


 
Anatoly Podgoretsky ©   (2007-09-24 15:16) [96]

> Инс  (24.09.2007 15:06:33)  [93]

Не боюсь, я уже давно ничего не боюсь. Выбор сделан с осознанием.
Таки и не использую.
А кто сказал, что я Dispose использую?


 
oxffff ©   (2007-09-24 15:17) [97]


> Anatoly Podgoretsky ©   (24.09.07 15:09) [95]
> > oxffff  (24.09.2007 15:03:32)  [92]
>
> Ты об нафиг оно нужно


:)

Вот если они сделают это на уровне языка


 
Инс ©   (2007-09-24 15:22) [98]


> А кто сказал, что я Dispose использую?

А где, говоря о Dispose, я сказал "Вы"?


 
Anatoly Podgoretsky ©   (2007-09-24 15:23) [99]

В контексте сообщения отнес к себе, а оказалось я тут не причем.


 
Инс ©   (2007-09-24 15:30) [100]

А интерфейсами лучше вообще никогда не пользоваться, там в одном из ключевых методов (QueryInterface) вообще out-параметр.


 
Плохиш ©   (2007-09-24 15:31) [101]


> Раз уж такое дело, то и Dispose использовать вредно.

Борланды в справке всё подробненько расписали, но "не царское это дело читать справку" у ССЗБ-н...


 
Инс ©   (2007-09-24 15:32) [102]


> Борланды в справке всё подробненько расписали, но "не царское
> это дело читать справку" у ССЗБ-н...

Это ты не мне, а [82] объясни.


 
Anatoly Podgoretsky ©   (2007-09-24 15:38) [103]

Чего тут спорить, с момента появления FreeAndNil ломают копья.
Разве это недостаточный критерий порочности?


 
Инс ©   (2007-09-24 15:41) [104]


> Чего тут спорить, с момента появления FreeAndNil ломают
> копья.

А до этого не ломали? Примеры поломаных об FreeAndNil копий в студию. Только не нужно приводить примеры, когда пострадавшие - уже упомянутые выше ССЗБ, они и на ровном месте себе шею сломают.


 
Джо ©   (2007-09-24 15:51) [105]

> [93] Инс ©   (24.09.07 15:06)
> Раз уж такое дело, то и Dispose использовать вредно. Там ведь  
> параметр типа Pointer стоит, который на самом деле таковым быть не
> должен.

Как это «не должен» и почему так?


 
Anatoly Podgoretsky ©   (2007-09-24 15:56) [106]

> Инс  (24.09.2007 15:41:44)  [104]

> Примеры поломаных об FreeAndNil копий в студию.

Так выброшены, и копья ломают не из-за пострадавших, они действительно ССЗБ
Ломают над нужностью/не нужностью, из-за названия, из-за политики Борланда, которые во многих случаях пошли по популисткому пути, после Д5.
Я на стороне тех, кто не согласен с Борландом.


 
Anatoly Podgoretsky ©   (2007-09-24 15:59) [107]

> Джо  (24.09.2007 15:51:45)  [105]

Не знаю, давно не использовал Dispose, но по моему должен, это же указатель на структуру или простой тип, а тут речь об объектах.
Разные все таки вещи. Я всегда использую GetMem/FreeMem может крома младенческих лет. Эти функции честные - сказано выделить память и никаких других толкований.


 
Инс ©   (2007-09-24 15:59) [108]


> Джо ©   (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) - все будет нормально.


 
Инс ©   (2007-09-24 16:04) [109]

GetMem/FreeMem - это тупое выделение и освобождение памяти. New и Dispose - умнее, они инициализируют и финализируют поля финализируемых типов. Если вызвать Dispose и передать ей нетипизированный указатель на стуктуру, содержащую такие поля, они финализированы не будут. Это очень частая ошибка.


 
oxffff ©   (2007-09-24 16:16) [110]


> Инс ©   (24.09.07 16:04) [109]
> GetMem/FreeMem - это тупое выделение и освобождение памяти.
>  New и Dispose - умнее, они инициализируют и финализируют
> поля финализируемых типов. Если вызвать Dispose и передать
> ей нетипизированный указатель на стуктуру, содержащую такие
> поля, они финализированы не будут. Это очень частая ошибка.
>


Тебе же сказали, что все делают ручками.

FreeMem(pointer(integer(rec^.s)-8))

Typeinfo это вред.

:)


 
oxffff ©   (2007-09-24 16:26) [111]


> Тебе же сказали, что все делают ручками.


А при возможности вообще пишут не на ассемблере, а сразу в машинных кодах.


 
Anatoly Podgoretsky ©   (2007-09-24 16:35) [112]

> Инс  (24.09.2007 16:04:49)  [109]

Я хорошо знаю, что они умнее и для чего нужны, но что же мне делать, если я не использую таких структур, да и память уже не помню когда выделял.


 
Anatoly Podgoretsky ©   (2007-09-24 16:36) [113]

> oxffff  (24.09.2007 16:26:51)  [111]

Не в ту степь обсуждение пошло, давайте продолжать обсасывать, облизывать FreeAndNil или исписались?


 
oxffff ©   (2007-09-24 16:38) [114]


> Anatoly Podgoretsky ©   (24.09.07 16:36) [113]
> > oxffff  (24.09.2007 16:26:51)  [111]
>
> Не в ту степь обсуждение пошло, давайте продолжать обсасывать,
>  облизывать FreeAndNil или исписались?


oxffff ©   (24.09.07 15:17) [97]


 
Инс ©   (2007-09-24 16:44) [115]


> Я хорошо знаю, что они умнее и для чего нужны, но что же
> мне делать, если я не использую таких структур, да и память
> уже не помню когда выделял.

Это я г-ну Джо объяснял, почему в парметрах к процедуре Dispose должен быть не Pointer, а типизированный указатель, хотя и вам тоже полезно будет, так как то, что вы хорошо знаете, что они умнее и для чего нужны - я уже сомневаюсь, судя по фразе "Не знаю, давно не использовал Dispose, но по моему должен". А насчет FreeAndNil - что тут обсуждать. Все уже давно сказано, каждый остается при своем. Я вот только понять не могу, почему те, кто не согласен с Borland, до сих пор сидят за Delphi...


 
Anatoly Podgoretsky ©   (2007-09-24 16:51) [116]

> Инс  (24.09.2007 16:44:55)  [115]

Это я сейчас не знаю (не помню), но это не относится к тому моменту, когда я захочу использовать.


 
Джо ©   (2007-09-24 17:12) [117]

> [115] Инс ©   (24.09.07 16:44)
> Это я г-ну Джо объяснял, почему в парметрах к процедуре
> Dispose должен быть не Pointer, а типизированный указатель

Увы, синтаксис не позволяет.


 
Инс ©   (2007-09-24 17:19) [118]


> Увы, синтаксис не позволяет.

Так и с FreeAndNil та же история. Нельзя написать
procedure FreeAndNil(var Obj: TObject);


 
Leonid Troyanovsky ©   (2007-09-24 17:35) [119]


> Джо ©   (24.09.07 17:12) [117]

> > Dispose должен быть не Pointer, а типизированный указатель
>
> Увы, синтаксис не позволяет.

А почему "увы"? По-моему, да и хрен с ним.
Кому сейчас нужны структуры со стрингами и вариантами.
Т.е., кому нужны - пользуют объекты.

--
Regards, LVT.


 
Джо ©   (2007-09-24 20:11) [120]

> [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, а типизированный указатель
> >
> > Увы, синтаксис не позволяет.
>
> А почему "увы"? По-моему, да и хрен с ним.

Да по-моему так же.



Страницы: 1 2 3 4 вся ветка

Текущий архив: 2007.10.21;
Скачать: CL | DM;

Наверх




Память: 0.7 MB
Время: 0.028 c
3-1181390241
Lavrenty
2007-06-09 15:57
2007.10.21
Переменное число параметров запроса


2-1190796642
F@T@L_Err0r
2007-09-26 12:50
2007.10.21
TColor


2-1191265539
Farel
2007-10-01 23:05
2007.10.21
Blob


15-1190385700
Windows_XP
2007-09-21 18:41
2007.10.21
Легально ли использовать Windows XP Home Edition в комерческих целях?


15-1190615735
БарЛог
2007-09-24 10:35
2007.10.21
Проблема при установке Win 2003, XP...