Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

Совершенный код. Мастер-класс - Макконнелл С.

Макконнелл С. Совершенный код. Мастер-класс — М.: Русская редакция, 2005. — 896 c.
ISBN: 5-469-00822-3
Скачать (прямая ссылка): soversheniykodmasterklass2005.djvu
Предыдущая << 1 .. 157 158 159 160 161 162 < 163 > 164 165 166 167 168 169 .. 426 >> Следующая

заказчику. По симптомам таких ошибок тяжело понять, что их
вызывало. Поэтому самым трудоемким в процессе исправления
ошибок указателя является поиск их причины.
Для успешной работы с указателями требуется двухэтапная
стратегия. Во-первых, старайтесь изначально не делать в них
ошибок. Проблемы с указателями так сложно обнаружить, что
дополнительные превентивные меры вполне оправданны. Во-вторых,
выявляйте ошибки в указателях как можно быстрее после того,
как они закодированы. Симптомы ошибок в указателях настолько
изменчивы, что дополнительные меры с целью сделать эти симп-
томы более предсказуемыми, также вполне оправданны. Вот как
можно добиться этих ключевых целей.
Изолируйте операции с указателями в методах или классах
Допустим, в нескольких частях программы используется связный
список. Вместо того чтобы каждый раз обрабатывать его вручную,
напишите методы доступа NextLinkQ, Рге- viousLink(),
InsertLinkQ и DeleteLinkQ. Минимизировав количество мест, в
которых выполняется обращение к указателю, вы уменьшите
вероятность неосторожных ошибок, распространяющихся по всей
программе, на поиск которых уходит вечность. Поскольку такой
код становится относительно независимым от деталей пред-
ставления данных, вы также увеличиваете шансы его повторного
использования в других программах. Написание методов,
распределяющих память для указателей, - еще один способ
централизовать управление вашими данными.
Выполняйте объявление и определение указателей одновременно
Присвоение переменной начального значения рядом с местом ее
объявления - как правило, хорошая практика программирования.
Она обладает особой ценностью при работе с указателями. Вот
как не надо делать:
Пример неправильной инициализации указателя (C++)
Employee *employeePtг;
// много кода
employeePtr = new Employee;
Даже если этот код изначально работает правильно, при
дальнейших модификациях он подвержен ошибкам, так как
существует шанс, что кто-нибудь попробует
ГЛАВА 13 Нестандартные типы данных
317
использовать employeePtr после его объявления, но до
инициализации. Вот более безопасный подход:
Пример правильной инициализации указателя (C++)
// много кода
Employee *employeePtr = new Employee;
Удаляйте указатели в той же области действия, где они были
созданы
Соблюдайте симметрию при выделении и освобождении памяти для
указателей. Если вы используете указатель в единственном блоке
кода, вызывайте new для выделения памяти и delete для ее
освобождения в том же блоке. Если вы распределяете память
внутри метода, освобождайте ее внутри аналогичного метода, а
если в конструкторе объекта - освобождайте в деструкторе этого
объекта. Метод, выделяющий память для указателя, а затем
ожидающий, что клиентский код вручную его освободит, нарушает
целостность, что прямиком ведет к ошибкам.
Проверяйте указатели перед их применением Прежде чем
использовать указатель в критической части вашей программы,
удостоверьтесь, что он указывает на осмысленную область
памяти. Так, если вы ожидаете, что память распределяется между
адресами StartData и EndData, у вас должно вызывать
подозрение, если значение указателя меньше, чем StartData, или
больше, чем EndData. Вам надо определить значения StartData и
EndData в вашей системе. Эту проверку можно выполнять
автоматически, если обращаться к указателям не напрямую, а
через методы доступа.
Проверяйте переменную, на которую ссылается указатель, перед
ее использованием Иногда вы можете выполнить корректную
проверку значения, на которое ссылается указатель. Скажем,
если вы предполагаете, что он указывает на целое число от 0 до
1000, значения больше 1000 должны вызывать у вас подозрение.
Если указатель ссылается на строку в стиле C++, ее длина свыше
100 символов также может вызывать недоверие. Эти проверки тоже
могут быть выполнены автоматически при работе с указателями с
помощью методов доступа.
Используйте закрепленные признаки для проверки повреждения
памяти
"Поле-тэг" (tag field) или "закрепленный признак" (dog tag) -
это поле, которое вы добавляете к структуре исключительно с
целью проверки ошибок. Когда вы выделяете память для
переменной, поместите в это поле закрепленного признака
значение, которое должно остаться неизменным. Используя
структуру, особенно освобождая для нее память, проверяйте
значение закрепленного признака. Если это поле не содержит
ожидаемого значения, значит, данные были повреждены.
Удаляя указатель, измените значение этого поля. Так вы сможете
выявить ошибку, если случайно попытаетесь освободить этот
указатель еще раз. Например, пусть нам нужно выделить 100 байт
памяти:
1. Выделите 104 байта - на 4 байта больше, чем требуется.
104 байта
318 ЧАСТЬ III Переменные
2. Укажите в первых четырех байтах значение обязательного
признака, а затем верните указатель на область, следующую за
этими четырьмя байтами.
Установите указатель сюда
[признак]
3. Когда понадобится удалить указатель, проверьте значение
Предыдущая << 1 .. 157 158 159 160 161 162 < 163 > 164 165 166 167 168 169 .. 426 >> Следующая