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

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

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

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

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

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

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

проверить, находится ли указатель в этом списке перед его
освобождением. Вот как для этих целей может быть изменен код
удаления указателя:
Пример проверки, выделялась ли память для указателя (C++)
ASSERT( pointer != NULL, "Attempting to delete null pointer."
); if ( IsPointerInList( pointer ) ) {
memset( pointer, GARBAGE_DATA, MemoryBlockSize( pointer ) );
RemovePointerFromList( pointer ); delete pointer; pointer =
NULL;
}
else {
ASSERT( FALSE, "Attempting to delete unallocated pointer." );
}
Напишите методы-оболочки, чтобы централизовать стратегию борь-
бы с ошибками в указателях Как видно из этого примера, каждый
вызов операторов new и delete может сопровождаться достаточно
большим количеством дополнительного кода. Некоторые
технологии, описанные в этом разделе, являются
взаимоисключающими или избыточными, и не хотелось бы
использовать несколько конфликтующих стратегий в одной
программе. Например, вам не надо создавать и проверять
обязательные признаки, если вы поддерживаете собственный
список действительных указателей.
Вы можете минимизировать избыточность в программе и уменьшить
вероятность ошибок, написав методы-оболочки для общих операций
с указателями. В C++ вы могли бы использовать следующие
методы:
¦ SAFE NEW Вызывает new для выделения памяти, добавляет
указатель в список задействованных указателей и возвращает
вновь созданный указатель вы
ГЛАВА 13 Нестандартные типы данных
323
зывающей стороне. Он может также проверить, что оператор new
не вернул null (ошибка нехватки памяти). Поскольку это надо
сделать только единожды в этом месте, упрощается процесс
обработки ошибок в других частях вашей программы.
¦ SAFEDELETE Проверяет, находится ли переданный ему указатель
в списке действительных указателей. Если он там есть, метод
записывает мусор в адресуемую им память, удаляет указатель
из списка, вызывает С++-оператор delete для освобождения
памяти и устанавливает указатель в null. Если указатель не
найден в списке, SAFEDELETE выводит диагностическое
сообщение и прерывает программу.
Метод SAFE DELETE, реализованный в виде макроса, может
выглядеть так:
Пример добавления оболочки для кода удаления указателя (C++)
#define SAFE_DELETE( pointer ) { \
ASSERT( pointer != NULL, "Attempting to delete null
pointer."); \ if ( IsPointerInList( pointer ) ) { \
memset( pointer, GARBAGE_DATA, MemoryBlockSize( pointer ) ); \
RemovePointerFromList( pointer ); \ delete pointer; \ pointer
= NULL; \
} \
else { \
ASSERT( FALSE, "Attempting to delete unallocated pointer."
} \
}
В C++ этот метод будет освобождать единичные указатели,
поэтому вам придется создать похожий макрос SAFE DELE- TE
ARRAY для удаления массивов.
Централизовав управление памятью в этих двух методах, вы также
сможете менять поведение SAFE NEW и SAFE DELETE в отладочной и
промышленных версиях продукта. Например, обнаружив попытку
освободить пустой указатель в период разработки, SAFE_ DELETE
может остановить программу. Но если это происходит во время
эксплуатации, он может просто записать ошибку в журнал и
продолжить выполнение.
Вы легко сможете адаптировать эту схему для функций calloc и
free в языке С, а также для других языков, использующих
указатели.
Используйте технологию, не основанную на указателях Указатели
в целом сложнее для понимания, они подвержены ошибкам и
приводят к созданию машинно-зависимого, непереносимого кода.
Если вы можете придумать разумную альтернативу указателям,
избавьте себя от головной боли и возьмите ее за основу.
Указатели в C++
Язык C++ добавил специфические тонкости при работе с
указателями и ссылками. В следующих подразделах описаны
основные принципы, применяемые в работе с указателями на C++.
); \
Перезреет*" ссылка 0 планах по удалению отладочного кода ш,
подраздел "Запланируйте удаление отладочных средств" раздела Ш
324 ЧАСТЬ III Переменные
Доодшгш&ные еведеяия Мно~ Осознайте различие между
указателями и ссылка-
жвствз других советов т при- ми В C++ и указатели (*), и
ссылки (&) косвенно ссылают-
менению указателей 0 C++ см, ся на объект. Для непосвященных
единственной, чисто кос-
в "Effective C++", 2d е& (Meyers, метической разницей между
ними будет способ обращения
(Meyers 199в)в Eff6Ct*V0 ***** к полю: object->field или
objectfield. Наиболее значительным
различием является то, что ссылка обязана всегда ссылаться
на объект, тогда как указатель может быть равен null. Кроме
того, после инициализации ссылки нельзя изменить то, куда она
ссылается.
Используйте указатели для передачи параметров "по ссылке" и
константные ссылки для передачи параметров то значению" По
умолчанию C++ передает в методы аргументы по значению, а не по
ссылке. Когда объект передается по значению, C++ создает копию
объекта, и при передаче объекта вызывающей программе вновь
создается копия. Для больших объектов такое копирование может
съедать много времени и ресурсов. Следовательно, при передаче
Предыдущая << 1 .. 160 161 162 163 164 165 < 166 > 167 168 169 170 171 172 .. 426 >> Следующая