Войти
Правильное резюмеСтатьи

нюансы по программированию на языке C++

Внимание! Этот документ ещё не опубликован.

Автор:

Статья не для новичков)
В этой статье представлены мои взгляды по вопросам языка C++, которые плохо освящаются во всех книгах, кроме книг Б. Страуструпа. Хвала, почёт, и уважение ему.) Лично мои взгляды развились именно из его книг.


Namespaces


Пространство имен (namespace) является механизмом отражения логического группирования. То есть если некоторые объявления можно объединить по какому-либо критерию, их можно поместить в одно пространство имен для отражения этого факта.

Преимущества пространство имён:
-отражение логической структуры
-исключение возможности конфликтов имён
-выражать логически связанный набор средств
-препятствовать доступу пользователей к ненужным им средствам
-не требовать значительных дополнительных усилий при использовании

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

Оператор new (выделение памяти)


В С++ до появление механизма исключений оператор new возвращал 0, когда выделение памяти не удалось. В стандарте С++ new по умолчанию генерирует исключение bad_alloc.
Как правило лучше стремится к сходству со стандартом. Т.е. лучше изменить программу так, чтобы перехватывать bad_alloc, а не проверять на 0. В обоих случаях сделать что-то кроме выдачи сообщения об ошибке не так-то просто в большинстве систем.

Смотрите пункт 5.3.4. Подпункт 13.
http://www.ishiboo.com/~nirva/c++/C++STANDARD-ISOIEC14882-1998.pdf

Для компилятора Visual Studio:

1) new (std::nothrow) – не кидает исключение
2) обычный new -  кидает исключение
3) можно настроить поведение с помощью опций линковщика:
http://msdn.microsoft.com/en-us/library/kftdy56f.aspx

Исключения

Когда программа конструируется из раздельных модулей и особенно когда эти модули находятся в независимо раздельных библиотеках обработка ошибок должна быть разделена на две части:
- генерация информации о возникновении ошибочной ситуации, которая не может быть разрешена локально
- обработка ошибок, обнаруженных в других местах

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

-Как правило разделение кода обработки ошибок и “нормального” кода является хорошей стратегией
- Генерация исключения может оставить объект в недействительном состоянии.
- Генерация исключения может быть источником утечек памяти и других ресурсов из-за
отсутствия закрытия ресурса. Для правильного освобождения объекта лучше полагаться на свойства конструкторов и деструкторов и на их взаимодействие с обработкой исключений.(При выходе из блока с помощью генерации исключения происходит очистка всех созданных локальных автоматических объектов в обратном порядке создания.)
Также стандартная библиотека предоставляет шаблон auto_ptr


- Написать правильный безопасный при исключениях код с помощью явных try может оказаться трудной задачей.

Замечания:
- Можно группировать исключения, отношением наследования
- Исключения в момент генерации копируется. Модификатор const в блоке ни на что не влияет.
- Возможно повторно генерировать исключение
- При генерации исключения в конструкторе деструктор объекта не вызывается.
- Если во время вызова деструктора в процессе обработки исключения в деструкторе вызывается исключение – то это считается ошибкой механизма обработки  исключения и вызывается std::terminate().
- Выход из деструктора через генерацию исключения является нарушением требований стандартной библиотеки.
- Если исключение сгенерировано, но не перехвачено вызывается std::terminate

#C++

25 января 2011