Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2009.12.27;
Скачать: [xml.tar.bz2];

Вниз

Статья на хабаре про Делфи «создание и уничтожение объектов...»   Найти похожие ветки 

 
jack128_   (2009-10-23 09:56) [40]


> Кстати, у меня не бывает AV. Удивись.

А. Ну тогда конечно.
Кста, а зачем тут: http://delphimaster.net/view/3-1239773025/  в восьмом посте ты вызвал: DBParams.Free; а не DBParams.Destroy ?


> Все зависит где будет объект в кучи.

"объект в куче" расположен по адресу nil, потому что я строчкой выше вызвал FreeAndNil.


 
Ухарь   (2009-10-23 10:02) [41]


> @!!ex ©   (23.10.09 00:13) [22]
>
> > [16] jack128_   (23.10.09 00:02)
>
> Как надо говнокодить, чтобы обращаться к удаленному объекту?
> ?


А ты можешь себе представить ситуацию, когда один и тот же объект находится сразу в нескольких списках?


 
oxffff ©   (2009-10-23 10:04) [42]


> > Все зависит где будет объект в кучи.
>
> "объект в куче" расположен по адресу nil, потому что я строчкой
> выше вызвал FreeAndNil.


Ты говорим о разных вещах.


 
jack128_   (2009-10-23 10:07) [43]


> А ты можешь себе представить ситуацию, когда один и тот
> же объект находится сразу в нескольких списках?

в этом случае FreeAndNil не поможет.


 
oxffff ©   (2009-10-23 10:09) [44]


> Ты говорим


:)
Мы говорим.


 
Alkid ©   (2009-10-23 10:27) [45]


> GDI+   (22.10.09 22:54) [2]

А я на C++ предпочитаю использовать std::auto_ptr и не париться с удалением объекта в деструкторе.


 
Anatoly Podgoretsky ©   (2009-10-23 14:01) [46]


> oxffff ©   (23.10.09 10:09) [44]

До чего Интернет доводит, уже боимся множественное число применять.

Не знаю будет ли защитан мой голос, но я никогда FreeAndNil не использовал. Я считаю это вредным изобретением и понятно откуда уши растут.


 
@!!ex ©   (2009-10-23 14:03) [47]

> [41] Ухарь   (23.10.09 10:02)

Могу. У меня есть отдельный список форм  текущем проекте.
Этот список удалением не занимаеться, поскольку формы удаляются в другом месте.
Опять же, это вопрос архитектуры.
Как вариант - научить объект удалять себя из списков куда он помещен.


 
Leonid Troyanovsky ©   (2009-10-23 14:10) [48]


> @!!ex ©   (23.10.09 14:03) [47]

> Могу. У меня есть отдельный список форм  текущем проекте.

See also Screen.Forms.

> Как вариант - научить объект удалять себя из списков

Notification forever!

--
Regards, LVT.


 
@!!ex ©   (2009-10-23 14:13) [49]

> [48] Leonid Troyanovsky ©   (23.10.09 14:10)
> See also Screen.Forms.

О чем я и говорю. Есть Screen.Forms и есть дополнительно мой список. Так что я вполне представляю ситуацию в которой объект может существовать в нескольких списках.


> [48] Leonid Troyanovsky ©   (23.10.09 14:10)
> Notification forever!

Вот и я о том же.


 
GDI+   (2009-10-23 18:01) [50]


> Alkid ©   (23.10.09 10:27) [45]
>
>
> > GDI+   (22.10.09 22:54) [2]
>
> А я на C++ предпочитаю использовать std::auto_ptr и не париться
> с удалением объекта в деструкторе.


Хм, а он разве потокобезопасный? Хотя это от реализации stl зависит. Так что я предпочитаю сам проверить чем потом искать баги. Их и так хватает тех же системных. Вот в Windows7 Gdi+ сломали, теперь она глючит при использовании интерполяции NearestNeighbour и CopyMode при отрисовке графического объекта.


 
Ухарь   (2009-10-23 18:18) [51]


>@!!ex ©  
> Бывает. Но я не могу припомнить случая, чтобы эти AV были
> вызваны удаленным объектом, к которому идет обращение.
>
> P.S. Сейчас 90% AV из-за обращения по нулевому адресу. :
> )


Какая то принципиальная разница между обращением к удаленному объекту, и обращением к еще не созданному объекту есть?
как то странно получается - в первом случае значит "говнокод", а во втором все допустимо?


 
Leonid Troyanovsky ©   (2009-10-23 18:29) [52]


> Ухарь   (23.10.09 18:18) [51]

> Какая то принципиальная разница между обращением к удаленному
> объекту, и обращением к еще не созданному объекту есть?

Разницы, дейс-но, нет. На 90% лечится путем if Assigned(x) then.
Ведь, IMHO, вопрос сводился к валидности хранимых ссылок?

Другими словами: для дезавуирования инвалидных ссылок
на интересующий объект хранителю оных достаточно получить
уведомление о разрушении оного объекта.

--
Regards, LVT.


 
@!!ex ©   (2009-10-23 19:19) [53]

> [51] Ухарь   (23.10.09 18:18)

У меня нет обращения к еще не созданным объектам.
На данный момент AV бывает в двух слячаях:
1) Кривые скрипты - 98% на этом вываливается. Думали вставить проверки, но ни сильно убивают скорость, решили пока не трогать.
2) 1% Обращение к модели, которой физически на диске не существует. Давно зочу исправить, все из головы вылетает... Вот, кстати, сейчас и пойду исправлю.

Ну и оставшийся процент - это банальные косяки в коде, к счастью бывает очень редко.


 
Ухарь   (2009-10-23 19:42) [54]


> @!!ex ©  


> У меня нет обращения к еще не созданным объектам.
> На данный момент AV бывает в двух слячаях:


Если AV идет по нулевому адресу, то в любому случае это обращение либо к убитому, либо к нерожденному. И что там именно - объект с т. зр паскаля, структура, или что-то третье, пусть не делфийское - принципиально не важно.


> Leonid Troyanovsky ©   (23.10.09 18:29) [52]



> Ведь, IMHO, вопрос сводился к валидности хранимых ссылок?


Честно говоря, потерял нить -  о чем вопрос. Я в данном случае спорю с утверждением "если у вас обращение к уже разрушенному объекту, то у вас говнокод"

А по FreeAndNil имхо ответ очевиден - где надо - там используем, где не надо - там не используем


 
@!!ex ©   (2009-10-23 19:47) [55]

> [54] Ухарь   (23.10.09 19:42)

Нет. Обращение к объекту которого нет в принципе. Он не создан и не может быть создан.
Просто скриптер передает туда значение от балды. прога валится. Проверять смысла нет, потому что не штатная ситуация и в процессе работы возникнуть не может.

> [54] Ухарь   (23.10.09 19:42)
> Я в данном случае спорю с утверждением "если у вас обращение
> к уже разрушенному объекту, то у вас говнокод"

Ошибки в коде приводящие к этому - это может быть и не в говнокоде.
Говнокод это в том случае, если мы это дело маскируем как было показано в [2]. Потому что такое не максировать надо, а убирать нафиг.


 
Ухарь   (2009-10-23 19:59) [56]


> @!!ex ©   (23.10.09 19:47) [55]


.
> Говнокод это в том случае, если мы это дело маскируем как
> было показано в [2].


Маскировать то конечно ничего не надо. НО обниливание ссылки приведет скорее к выявлению ошибки, чем к ее маскировке. Потому что при обращении по адресу, где раньше был объект, AV можно и не получить.  А именно двойное разрушение - случай более редкий, чем просто обращение к разрушенному, его частный случай.
Насколько я понимаю, в  [2] показан полный аналог TObject.Free;
Это тоже маскировка ошибок?


 
Kolan ©   (2009-10-23 20:22) [57]


> Потребитель может не знать о существовании других объектов
> и о пуле в частности. Они например могут использоваться
> другимим потребителями.

Если потребитель не знает, то знает сам объект, тогда опять получаем что-то вроде:
Object[I].ParentObjectList.Clear();

А если другими объектами пользуются, то надо делать систему уведомлений, пример в VCL.

А есть реальный пример, почему-то есть подозрение, что плохой дизайн во многом виноват...


 
GDI+   (2009-10-23 22:10) [58]

@!!ex ©   (23.10.09 19:47) [55]

> [54] Ухарь   (23.10.09 19:42)

Ошибки в коде приводящие к этому - это может быть и не в говнокоде.
Говнокод это в том случае, если мы это дело маскируем как было показано в [2]. Потому что такое не максировать надо, а убирать нафиг.


Нуу... лично я такое не маскирую, но библиотеки мои используют люди с различным уровнем квалификации.

Например было, когда человек работал с VCL моими компонентами из нескольких потоков без синхронайзе, причем в компонентах не предусматривалась вытуренный thread safe, так как были рассчитаны на работу в основном потоке.

Так вот, в результате оно даже не очень глючило(при такой ГЛОБАЛЬНОЙ ошибке) и относительно нормально работало.

PS
Во к примеру как вам больше нравится такая обработка ошибок как в Сталкере ЧН(когда при любой ошибке валится игра и отравляется отчёт в поддержку) или тихий глюк как в Обливионе, где при возникновении ошибки может быть просто невозможно пройти один из многочисленных квестов.

PS
Сейчас стандартом похоже стало не работоспособная не смотря не на что программа, а окошко с гламурными кнопочками сигнализирующее падение программы и предлагающее отправить отчёт разработчику. Но многие программисты забывают что ПО это не изделие, а услуга, если она станет не удовлетворять бизнес-модели, пользователь найдёт другую услугу(ПО).


 
@!!ex ©   (2009-10-23 22:14) [59]

> [58] GDI+   (23.10.09 22:10)

Сталкер свалится, ты загрузишься и дальше играть продолжишь.
А тот же Обливион может тебе все запороть, а ты узнаешь об этом после того как уже все сейвы будут дохлые....

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


 
@!!ex ©   (2009-10-23 22:25) [60]

Сейчас мода не на приложения с красивыми окошками, а на быстрый выброс на рынок не тестированного софта.
По поводу продолжения работы после ошибок:
У левелдизайнеров, которые работают сейчас со мной над проектом прямое указание: в случае возникновения ошибки в редакторе, даже если после ошибки редактор дальше нормально работает, перезапускать редактор БЕЗ сохранения работы.
Потому что Эксцепшн - это уже выход системы в нештатоное состояние. AV в частности - это кривой указатель. Что может натворит ькривой указатель вы и без меня знаете.
Это примерно как машина у которой заклинил ГУР. Можно дальше ехать, но в кювет улететь можно без проблем. Всяко лучше остановится и тех помощь вызвать.
Опять же скрытая ошибка так и будет скрытой. А явная, позволит пользователю отправить мессагу в саппорт.
ОДно дело игра, которая через 10 часов будет навсегда с компа удалена. и на ошибки в ней всем плевать.
А другое дело нормальный софт... если в нем будут скрытые ошибки, замаскированные... ну лично я такой софт быстро удалю.


 
GDI+   (2009-10-23 22:33) [61]

>>@!!ex ©   (23.10.09 22:14) [59]
>>> [58] GDI+   (23.10.09 22:10)
>>Сталкер свалится, ты загрузишься и дальше играть продолжишь.

то-то с техподдержкой сталкера игроки матом разговаривали от такого сервиса.

>>А тот же Обливион может тебе все запороть, а ты узнаешь об этом после того как уже все сейвы будут дохлые....

консоль:
resurrect
placeatpc

На форумах обливиона давали простое быстрое решение данных стандартных багов. В том числе и от официальной техподдержки.


 
GDI+   (2009-10-23 22:35) [62]


> @!!ex ©   (23.10.09 22:25) [60]
> А другое дело нормальный софт... если в нем будут скрытые
> ошибки, замаскированные... ну лично я такой софт быстро
> удалю.



Удаляйте Windows, ставьте linux, там именно такая модель.


 
@!!ex ©   (2009-10-23 22:42) [63]

> [61] GDI+   (23.10.09 22:33)
> то-то с техподдержкой сталкера игроки матом разговаривали
> от такого сервиса.

Это проблемы отдельных представителей бизнеса.


> [62] GDI+   (23.10.09 22:35)
> Удаляйте Windows, ставьте linux, там именно такая модель.

Меня и под виндой все устраивает.


 
GDI+   (2009-10-23 22:58) [64]


> @!!ex ©   (23.10.09 22:25) [60]
> У левелдизайнеров, которые работают сейчас со мной над проектом
> прямое указание: в случае возникновения ошибки в редакторе,
>  даже если после ошибки редактор дальше нормально работает,
>  перезапускать редактор БЕЗ сохранения работы.


ЗЫ
Кстати у вас все ошибки логируются или нет, или как потом разработчик может исследовать ошибку?

Используют ваши гейм-дизайнеры svn/cvs?


 
@!!ex ©   (2009-10-23 22:59) [65]

> [64] GDI+   (23.10.09 22:58)

SVN мы используем. Логируется конечно. Исключения не логируются, они просто шоты делают.
Но эксцепшены это редкость к счастью.


 
GDI+   (2009-10-23 23:00) [66]

>>@!!ex ©   (23.10.09 22:42) [63]
>>Это проблемы отдельных представителей бизнеса.

Которые перейдут на более "стабильный" аналог вашего ПО и знакомым предложат перейти.

PS
При разработке программ я более учитываю психологию пользователя, чем всяки рекомендации по разработке, так как деньги платят не адепты разработки, а конечные пользователи.

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


 
GDI+   (2009-10-23 23:05) [67]


> @!!ex ©   (23.10.09 22:59) [65]


Ну у нас есть свой логгер на обрабатываемые исключения и Еврикалог на необрабатываемые.

При возникновении исключения более важное - сохранить как можно более полную информацию о нем, чем всё остальное.

> @!!ex ©   (23.10.09 22:59) [65]
> SVN мы используем. Логируется конечно. Исключения не логируются,
>  они просто шоты делают.


Попробуйте заставить не пользователей внутреннего ПО а внешних заставить делать скриншоты.

xxx: тааак, вы исправили ошибку?
yyy: Если честно, то мы везде по несколько раз проверяли и не нашли.
xxx: прога не работает, а вы проблему не нашли? это 3.14здец какой-та! мля фсё, утоплю всех фкровииии!!!
yyy: Вышлите скриншоты ошибок, мы определим причину, если скриншоты будут информативные.
xxx: я тебе скриншот своего голого ануса щас пришлю
yyy: Проблема предположительно именно в нём?


 
@!!ex ©   (2009-10-23 23:09) [68]

> [66] GDI+   (23.10.09 23:00)
> По поводу редактора - использование любой из систем контроля
> версий дало бы большую безопасность данных чем ваша рекомендация.

Одно другое не исключает.

> [67] GDI+   (23.10.09 23:05)
> Попробуйте заставить не пользователей внутреннего ПО а внешних
> заставить делать скриншоты.

Зачем заставлять? Это автоматом делается. :D

Вы мне сейчас что сказать хотите? Что исключения надо сохранять и сообщать о них? Я с этим и не спорил.
Я спорл с тем, что софт должен продолжаться работать замалчивая исключения.


 
GDI+   (2009-10-24 00:00) [69]


> @!!ex ©   (23.10.09 23:09) [68]
> Зачем заставлять? Это автоматом делается. :D
>
> Вы мне сейчас что сказать хотите? Что исключения надо сохранять
> и сообщать о них? Я с этим и не спорил.
> Я спорл с тем, что софт должен продолжаться работать замалчивая
> исключения.


Если исключение прогнозируемо и обрабатывается то об этом максимум нужно залогировать его и уведомить пользователя. А далее продолжать работать с программой/уведомить техподдержку/прекратить работать с программой - это сознательный выбор пользователя.  Если произошла ошибка, о которой было сообщено, но пользователь её проигнорировал это дело пользователя.

То же самое как из-за ошибок в javascript сайтов я не хотел бы падения бровзера или надоедливого модального сообщения об этом.


 
@!!ex ©   (2009-10-24 00:03) [70]

> [69] GDI+   (24.10.09 00:00)

С этим я тоже спорить не буду.
Я буду спорить с тем что использование:
if (NULL != obj){
delete obj;
obj = NULL;
}

Во всех деструкторах как штатный код это нормально.
Это не нормально.


 
@!!ex ©   (2009-10-24 00:03) [71]

Ну и с тем что Обливион действует правильно игнорируя ошибки. С этим я тоже спорить буду.


 
GDI+   (2009-10-24 02:52) [72]


> @!!ex ©   (24.10.09 00:03) [71]
>
> Ну и с тем что Обливион действует правильно игнорируя ошибки.
>  С этим я тоже спорить буду.


Ну и спорьте. Обливион пока Top1 в RPG от первого лица. Они могут себе позволить сами устанавливать правила.


 
@!!ex ©   (2009-10-24 08:59) [73]

> [72] GDI+   (24.10.09 02:52)

А Microsoft Top1 в операционных системах. И как же мы. простые программисты смеем указывать им на ошибки! Это же MICROSOFT!
;)


 
GDI+   (2009-10-25 02:43) [74]


> @!!ex ©   (24.10.09 08:59) [73]
>
> > [72] GDI+   (24.10.09 02:52)
>
> А Microsoft Top1 в операционных системах. И как же мы. простые
> программисты смеем указывать им на ошибки! Это же MICROSOFT!


Укажите на конкретные ошибки в архитектуре ОС от Microsoft.

Здесь мы говорим не ошибках вообще, а об архитектурных ошибках.


 
Игорь Шевченко ©   (2009-10-25 02:53) [75]


> Укажите на конкретные ошибки в архитектуре ОС от Microsoft.


ОС от Microsoft, кстати, при ошибке ломается мгновенно и навсегда (в смысле, до перезагрузки). И сделано это намерено.


 
GDI+   (2009-10-25 03:11) [76]


> Игорь Шевченко ©   (25.10.09 02:53) [75]
> ОС от Microsoft, кстати, при ошибке ломается мгновенно и
> навсегда (в смысле, до перезагрузки). И сделано это намерено.


При ошибке в Kernel mode.

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


 
Игорь Шевченко ©   (2009-10-25 11:40) [77]

GDI+   (25.10.09 03:11) [76]


> С одной стороны это хорошо, так как у обычных "активных"
> пользователей которые использую несколько десятков программ
> Windows более полугода не живёт.


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


 
Игорь Шевченко ©   (2009-10-25 11:44) [78]

GDI+   (25.10.09 03:11) [76]

Что-то я смотрю, знакомое...



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

Форум: "Прочее";
Текущий архив: 2009.12.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.64 MB
Время: 0.008 c
6-1211188398
antonn (work)
2008-05-19 13:13
2009.12.27
Частота посыла пакета (TServerSocket и пт)


2-1257844185
defen
2009-11-10 12:09
2009.12.27
закрытие приложения


3-1232350553
Альф
2009-01-19 10:35
2009.12.27
Как отключить кеш в IB5.6 или что это было ?


3-1232472889
RustB
2009-01-20 20:34
2009.12.27
ADO, access, и как прочитать результат запроса.


15-1256506209
Юрий
2009-10-26 00:30
2009.12.27
С днем рождения ! 26 октября 2009 понедельник





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский