Как "вынудить" программиста юзать "смарт-указатель"? (C++)

Модератор: Модераторы разделов

Аватара пользователя
Zeus
Сообщения: 694

Re: Как "вынудить" программиста юзать "смарт-указатель"?

Сообщение Zeus »

v04bvs писал(а):
17.11.2007 17:01
В данном случае способ один - смена языка программирования. С++ по определению не надежный язык. Вам подойдёт язык вроде Java или Ada.

На Java уже писали до меня. Что-то не понравилось, видимо.
Про Ada вообще ничего сказать не могу. И написать на ней, соответственно, тоже.
И кто потом будет это сопровождать или хотя бы захочет в код заглянуть?
Я исходники чего-нибудь на Ada даже выкачивать не буду. Абсолютное большинство разработчиков, думаю, тоже.

А насчёт надёжности...
Тут ведь как напишешь. Можно и на Java такого наваять...
Тем более, что я-то пишу только относительно небольшой движок, который можно "вылизать", а остальное всё будут писать "прикладные" программисты (и я, конечно, в т.ч.) - у них возможности "накосячить" будет гораздо больше :)

И о безопасности:
Безопасное ПО - вообще такая скользкая тема... но все реализации которые я знаю, написаны на ассемблере или на чистом С, причём с очень урезанными библиотеками и с использованием сто раз перепроверенных и исследованных компиляторов.
И то не бойко дело идёт.

Zeus писал(а):
16.11.2007 23:20
Значит формулируйте мысли правильно, мы ведь не филологи какие. Указатель это MyClass* и не иначе. И здесь именно - что никак.

У меня везде, где указатель подразумевается не указатель, а что-то выполняющее его роль - это слово "указатель" берётся в кавычки.

Zeus писал(а):
16.11.2007 23:20
Если используются умные указатели - то вся тема выглядит попыткой изобрести один большой квадратный велосипед. Чем вас не устроил, скажем boost::shared_ptr ?

Я же не изобретаю умные "указатели": я спрашиваю - как программиста вынудить их использовать?
Ну т.е. мой движок отдаёт ему обычный указатель, но программист не может получить доступ к методам объекта - только через некий умный "указатель" или специальный интерфейс...
Но тут, в теме уже есть некоторые рекомендации, вроде "отдавать сразу смарт-указатель", возвращать "по значению" и т.п.

Zeus писал(а):
16.11.2007 23:20
PS перечитал тему, создалось впечатление, что вы не до конца понимаете, что такое умные указатели и почему их не удаляют.

Умный указатель - это объект класса. Он должен быть удалён: автоматически ли или "вручную". Или не так?
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: Как "вынудить" программиста юзать "смарт-указатель"?

Сообщение sergio »

v04bvs писал(а):
17.11.2007 18:12
sergio писал(а):
17.11.2007 14:30
Ну, маленькое формальное уточнение: это не просто метод, а метод для которого жестко задан прототип, и который не должен кидать исключения. )))


Так что, ещё более формально, деструктор кидать исключение таки может :) Но за это надо чего-нибудь отрывать :)
Кстати, АФАИК, terminate вызывается не скорее всего, а просто вызывается. Т.е. тут всё детерминировано. Но это, опять же, АФАИК.

Ну так я как раз сперва написал "не может", потом подумал и исправил на "не должен". :happy:
А нащет терминэйта - не помню. Но почти наверяняка реализация его вызовет. Бо нефиг такие извраты наворачивать, чтоб еще и толпу исключений одновременно... там черт ногу тогда сломит. И памяти не понятно сколько надо под них резервировать где-то...
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Как "вынудить" программиста юзать "смарт-указатель"?

Сообщение Zeus »

sergio писал(а):
17.11.2007 18:08
Когда летит исключение - раскручивается стэк и удляются стэковые объекты. При этом вызываются их деструкторы. Если во время обработки активного исключения предпринимается попытка выкинуть еще одно - это скорее всего приводит к terminate. Обработка более одного исключения одновременно инфраструктурой языка не гарантируется.

Я до этого места уже в "книге" дочитал =)
Там написано, что выброс исключения в обработчике исключения приводит к выходу из блока операторов или функции.
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: Как "вынудить" программиста юзать "смарт-указатель"?

Сообщение sergio »

Zeus писал(а):
17.11.2007 18:14
Про Ada вообще ничего сказать не могу. И написать на ней, соответственно, тоже.
И кто потом будет это сопровождать или хотя бы захочет в код заглянуть?
Я исходники чего-нибудь на Ada даже выкачивать не буду. Абсолютное большинство разработчиков, думаю, тоже.

Ада - штатный инструмент разработки ПО для авиации (не в РФ, видимо). Узкая ниша. Язык очень серьезный. В версии 95 появились метаклассы (ограниченная вроде бы версия, без плюсовых головоломок). Т.е. за три года до того, как были узаконены в плюсах и за десять лет до того, как господа из ява все же решили, что переборщили с упрощением своего детища. =)))
Встроенная поддержка потоков. И пры и пры. Собственно, один из языков, с огладкой на который создавалась Ява, помимо Смоллтока и Си++.
Основная проблема - обширный стандарт, сложные компиляторы, огромные пакеты тестов, обязательная сертификация (не дешевая, понятно) средств разработки.
Вот руки дойдут, соберусь поглядеть на Гнутую Аду. =))


Zeus писал(а):
17.11.2007 18:21
Я до этого места уже в "книге" дочитал =)
Там написано, что выброс исключения в обработчике исключения приводит к выходу из блока операторов или функции.

Выброс обработчике - да. Это немножко разные вещи. :happy:
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Как "вынудить" программиста юзать "смарт-указатель"?

Сообщение Zeus »

sergio писал(а):
17.11.2007 18:27
Zeus писал(а):
17.11.2007 18:21
Я до этого места уже в "книге" дочитал =)
Там написано, что выброс исключения в обработчике исключения приводит к выходу из блока операторов или функции.

Выброс обработчике - да. Это немножко разные вещи. :happy:

Поставил эксперимент - понял что ты имеешь ввиду.
Ну да, "Аварийный останов" говорит.
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Как "вынудить" программиста юзать "смарт-указатель"?

Сообщение v04bvs »

Zeus писал(а):
17.11.2007 18:14
На Java уже писали до меня. Что-то не понравилось, видимо.

Ну я за джаву мог бы поагитировать, но не буду, лень мне :) Скажу только, что мне она нравится.

Про Ada вообще ничего сказать не могу. И написать на ней, соответственно, тоже.

Ada разрабатывалась американскими военными, чтобы быть надёжной как автомат Калашникова. Там даже арифметические переполнения, вроде, отлавливаются.

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

Вообще то вам за это деньги платят :unsure: Наверное.. И абсолютному большинству разработчиков тоже.

А насчёт надёжности...
Тут ведь как напишешь. Можно и на Java такого наваять...

Ну на джаве Segmentation Fault получить довольно трудно. И, опять же, из личного опыта, на джаве после месяца опыта, у меня никаких проблем с граблями не было. Самая сложная тема - генерики, на которую я потратил полчаса времени. (Конечно про всякие библиотеки я здесь не говорю, но они к языку, как таковому, отношения не имеют) На С++ после лет 3 (и 1 коммерческого) лет опыта, я наступал на грабли снова и снова. Конечно грабли были каждый раз новые. Последняя хорошая грабля - когда из за шаблонов отдавалась ссылка на стековую переменную. Причём метод тот был написан частично на шаблонах, частично на макросах (и не мной). Половина рабочего дня на смарку. Может глупый я такой, не знаю.

Zeus писал(а):
16.11.2007 23:20
Я же не изобретаю умные "указатели": я спрашиваю - как программиста вынудить их использовать?
Но тут, в теме уже есть некоторые рекомендации, вроде "отдавать сразу смарт-указатель", возвращать "по значению" и т.п.

Отдавать умный указатель это стандартное решение для такого случая.

Умный указатель - это объект класса. Он должен быть удалён: автоматически ли или "вручную". Или не так?

Умный указатель всегда объявляется как стековая переменная. Соответственно при выходе из функции вызывается его деструктор, который и удаляет объект, на который указывал умный указатель. Вручную ничего удалять не надо. Примерно так:

Код: Выделить всё

 typedef boost::shared_ptr<MyClass> MyClassPtr;
  MyClassPtr getMyClass {
      return MyClassPtr(new MyClass(some, nice, arguments));
  }

  void foo() {
      MyClassPtr p = getMyClass();
      p->bar(here, we, call, method, of, MyClass_instance);
  }


и всё. Объекты удаляются автоматически.
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Как "вынудить" программиста юзать "смарт-указатель"?

Сообщение Zeus »

v04bvs писал(а):
17.11.2007 18:37
И кто потом будет это сопровождать или хотя бы захочет в код заглянуть?
Я исходники чего-нибудь на Ada даже выкачивать не буду. Абсолютное большинство разработчиков, думаю, тоже.

Вообще то вам за это деньги платят :unsure: Наверное.. И абсолютному большинству разработчиков тоже.

Тогда бы ada-программистов и надо было бы нанимать, а не нас обучать.
Я, вон, С++'ом прикладным (в теории не очень силён) занимаюсь уже лет эдак... 5, наверное. И то "как свинья в апельсинах". Ну, грубо говоря :D
А когда бы я (и остальная команда разработчиков) вышла бы хотя бы на такой же уровень - на Ada? :unsure:
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Как "вынудить" программиста юзать "смарт-указатель"?

Сообщение Liksys »

Zeus, мну писал на Ada, это мегагромоздкий язык. Уж не знаю, для чего его изобретали, но с возможностями там явно перебор. Вообще говоря, имхо, идеал (теоритический) - это смесь C++ (чистого!!!), C#, Python ну и еще мелочи вссякой. Автоматическое управление памятью, указатели/псевдонимы и прочие прибамбасы ;)
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Как "вынудить" программиста юзать "смарт-указатель"?

Сообщение drBatty »

Zeus писал(а):
17.11.2007 18:01
Хм... а зачем их тогда использовать - недобитые эти объекты? :unsure:

дык ты сам поставил задачу: программер юзает библиотеку(твою), убивает объект и пытается к ним обратится. Значит нужны недобитые объекты.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Как "вынудить" программиста юзать "смарт-указатель"?

Сообщение drBatty »

v04bvs писал(а):
17.11.2007 18:37
Отдавать умный указатель это стандартное решение для такого случая.

дык... Вот и всё.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
_shaman_
Сообщения: 5

Re: Как "вынудить" программиста юзать "смарт-указатель"?

Сообщение _shaman_ »

2 Zeus:
Есть замечательная вещь - библиотека boost.
А в ней есть не менее замечательная вещь - шаблон shared_ptr. Это шаблон позволяет автоматически удалять объекты, которые больше ненужны.

Возможности если вкратце - оборачивает объект твоего класса, при копировании копируется только обертка, сам объект не копируется и существует всегда в единственном экземпляре. Осуществляется подсчет ссылок, т.е. delete будет вызвано только после того, как удалится последний объект обертки, ссылающийся на данный объект.

Насчет запрещения программисту вызывать напрямую функции твоего класса - есть книжка, кого непомню (имена я плохо запоминаю), но могу поглядеть завтра и тебе сказать, на работе она. В ней эта тема подробно рассматривается, однако на мой взгляд смысл это имеет только тогда, когда ты пишешь библиотеку для массового использования другими программистами. Если ж ты пишешь для себя, то смысл тут нулевой, сам с собой ты завсегда договоришься.
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Как "вынудить" программиста юзать "смарт-указатель"?

Сообщение Zeus »

_shaman_ писал(а):
18.11.2007 14:43
2 Zeus:
Есть замечательная вещь - библиотека boost.
А в ней есть не менее замечательная вещь - шаблон shared_ptr. Это шаблон позволяет автоматически удалять объекты, которые больше ненужны.

А ещё позволяет получить указатель на объект который "контролирует" :tongue:

_shaman_ писал(а):
18.11.2007 14:43
Осуществляется подсчет ссылок, т.е. delete будет вызвано только после того, как удалится последний объект обертки, ссылающийся на данный объект.

Да мне в общем-то счётчик ссылок пока не надо. Хотя... подумаю - возможно и пригодится.

_shaman_ писал(а):
18.11.2007 14:43
Насчет запрещения программисту вызывать напрямую функции твоего класса - есть книжка, кого непомню (имена я плохо запоминаю), но могу поглядеть завтра и тебе сказать, на работе она. В ней эта тема подробно рассматривается

Книжка - не: "С++. Библиотека программиста"?
Мне её уже посоветовали. Читаю.
Спасибо сказали:
_shaman_
Сообщения: 5

Re: Как "вынудить" программиста юзать "смарт-указатель"?

Сообщение _shaman_ »

Zeus писал(а):
18.11.2007 17:15
_shaman_ писал(а):
18.11.2007 14:43
Насчет запрещения программисту вызывать напрямую функции твоего класса - есть книжка, кого непомню (имена я плохо запоминаю), но могу поглядеть завтра и тебе сказать, на работе она. В ней эта тема подробно рассматривается

Книжка - не: "С++. Библиотека программиста"?
Мне её уже посоветовали. Читаю.


А, во, нашел в электронном виде в pdf.
Андрей Александреску - "Современное проектирование на С++".

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

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

ЗЫ: Сам я так глубоко не курил, я другое в ней искал и даж нашел. А прочее я просмотрел, буде нужда появится, буду знать где искать.
Спасибо сказали: