Правила программирования на С и С++. Главы 7-8 - Глава 8.Ж. Управление памятью
Written on .
ОГЛАВЛЕНИЕ
- Правила программирования на С и С++. Главы 7-8
- Глава 7. Правила, относящиеся к языку С
- Подавляйте демонов запутанности (Часть 2)
- Избегайте битовых масок; используйте битовые поля
- Для битового поля размером 1 бит должен быть определен тип unsigned
- Указатели должны указывать на адрес, больший, чем базовый для массива
- Используйте указатели вместо индексов массива
- Избегайте goto, за исключением...
- Глава 8. Правила программирования на С++
- Глава 8.А. Вопросы проектирования и реализации
- Рассчитывайте потратить больше времени на проектирование и меньше на разработку
- Библиотеки классов С++ обычно не могут быть использованы неискушенными пользователями
- Пользуйтесь контрольными таблицами
- Сообщения должны выражать возможности, а не запрашивать (предлагать ?) информацию
- Вам обычно не удастся переделать имеющуюся структурную программу в объектно-ориентированную
- Наследование - это процесс добавления полей данных и методов-членов
- 98. Сначала проектируйте объекты
- Затем проектируйте иерархию снизу вверх
- Возможности, определенные в базовом классе, должны использоваться всеми производными классами
- Инициализируйте виртуальные базовые классы при помощи конструктора, используемого по умолчанию
- Используйте закрытые базовые классы лишь когда вы должны обеспечить виртуальные замещения
- Проектируйте структуры данных в последнюю очередь
- Никогда не допускайте открытого доступа к закрытым данным
- Не пользуйтесь функциями типа get/set (чтения и присваивания значений)
- Откажитесь от выражений языка С, когда программируете на С++
- Проектируйте с учетом наследования
- Функция-член должна обычно использовать закрытые поля данных класса
- Используйте константы
- Используйте структуры только тогда, когда все данные открытые и нет функций-членов
- Не размещайте тела функций в определениях классов
- Избегайте перегрузки функций и аргументов, используемых по умолчанию
- Глава 8.Б. Проблемы сцепления
- Избегайте дружественных классов
- Наследование - это форма сцепления
- Не портьте область глобальных имен: проблемы С++
- Глава 8.В. Ссылки
- Не возвращайте ссылки (или указатели) на локальные переменные
- Не возвращайте ссылки на память, выделенную оператором new
- Глава 8.Г. Конструкторы, деструкторы и operator=( )
- Присваивание самому себе должно работать
- Классы, имеющие члены-указатели, должны всегда определять конструктор копии и функцию operator=()
- Исходите из того, что члены и базовые классы инициализируются в случайном порядке
- Конструкторы копий должны использовать списки инициализации членов
- Производные классы должны обычно определять конструктор копии и функцию operator=( )
- Конструкторы, не предназначенные для преобразования типов, должны иметь два или более аргумента
- Используйте счетчики экземпляров объектов для инициализации на уровне класса
- Избегайте инициализации в два приема
- Глава 8.Д. Виртуальные функции
- Виртуальные функции - это те функции, которые вы не можете написать на уровне базового класса
- Виртуальная функция не является виртуальной, если вызывается из конструктора или деструктора
- Не вызывайте чисто виртуальные функции из конструкторов
- Деструкторы всегда должны быть виртуальными
- Функции базового класса, имеющие то же имя, что и функции производного класса, обычно должны быть виртуальными
- Не делайте функцию виртуальной, если вы не желаете, чтобы производный класс получил контроль над ней
- Защищенные функции обычно должны быть виртуальными
- Опасайтесь приведения типов (спорные вопросы С++)
- Не вызывайте конструкторов из операции operator=( )
- Глава 8.Е. Перегрузка операций
- Используйте перегрузку операций только для определения операций, имеющих аналог в С (без сюрпризов)
- Перегрузив одну операцию, вы должны перегрузить все сходные с ней операции
- Перегруженные операции должны работать точно так же, как они работают в С
- Перегруженной бинарной операции лучше всего быть встроенным (inline) псевдонимом операции приведения типа
- Не сходите с ума с операторами преобразования типов
- Глава 8.Ж. Управление памятью
- Вся память, выделенная в конструкторе, должна быть освобождена в деструкторе
- Локальные перегрузки операторов new и delete опасны
- Глава 8.З. Шаблоны
- Используйте встроенные шаблоны функций вместо параметризированных макросов
- Всегда знайте размер шаблона после его расширения
- Шаблоны не заменяют наследование; они его автоматизируют
- Глава 8.И. Исключения
- По возможности возбуждайте объекты типа error
- Возбуждение исключений из конструктора ненадежно
- Заключение
- Все страницы
Страница 64 из 74
Глава 8.Ж. Управление памятью
152. Используйте new/delete вместо malloc()/free().
Нет гарантии, что оператор new() вызывает malloc() при запросе памяти для себя. Он может реализовывать свою собственную функцию управления памятью. Следовательно, возникает трудно обнаруживаемая ошибка при передаче функцией free() памяти, полученной при помощи new (и наоборот).
Избегайте неприятностей, используя всегда при работе с С++ new и delete. Наряду с прочим это означает, что вы не должны пользоваться strdup() или любой другой функцией, скрывающей вызов malloc().