- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания Программирование на Visual C++. Архив рассылки - Алекс Jenter
Шрифт:
Интервал:
Закладка:
#ifdef _DEBUG
afxDump.SetDepth(1); // вывести информацию не только о коллекции,
afxDump << &arrPersons; // но и о всех ее членах (будет вызвана
// CPerson::Dump для каждого элемента массива)
#endif
Диагностика ошибок работы с памятьюОдна из самых распространенных ошибок при работе с памятью – выделение блока памяти (к примеру, при создании нового объекта) без его последующего освобождения (так называемые утечки памяти). Сами по себе эти утечки нефатальны ни для работы приложения, ни для работы системы (по завершению работы приложения Windows все равно освободит все занятые приложением блоки памяти), но это может привести к нехватке памяти, если приложение исполняется относительно долгое время (например, если это WinNT-сервис). Обычно для отслеживания утечек памяти используют специализированные программы, например, NuMega BoundsChecker, но и в MFC предусмотрены некоторые возможности для диагностики подобных ситуаций.
Класс CMemoryState предназначен для обнаружения динамически выделенных и не освобожденных впоследствии блоков памяти. Алгоритм работы с этим классом сводится к запоминанию списка созданных объектов функцией CMemoryState::Checkpoint, и последующим сравнением двух классов функцией CMemoryState::Difference. Например, вот так:
#ifdef _DEBUG
CMemoryState msStart, msEnd, msDiff;
msStart.Checkpoint(); // начало подозрительного блока
#endif
...
CPerson *pPerson = new CPerson();
...
#ifdef _DEBUG
msEnd.Checkpoint(); // конец подозрительного блока
if (msDiff.Difference(msStart, msEnd) {
TRACE0("Memory leaked!n");
msDiff.DumpAllObjectsSince(); //в Output-окне отладчика выведется
msDiff.DumpStatistics(); //информация о созданных объектах
//и о динамической памяти вообще
}
#endif
ПРИМЕЧАНИЕ
Обратите внимание на скобки #ifdef/endif – с классом CMemoryState можно работать только в Debug-версии библиотеки MFC.
Разработчики используют класс CMemoryState для проверки подозрительных кусков кода на корректность работы с динамической памятью. Библиотека MFC имитирует использование CMemoryState с помощью глобального объекта класса _AFX_DEBUG_STATE, в деструкторе которого вызывается функция _CrtDumpMemoryLeaks (подробнее об этом можно почитать в статье "Обнаружение и локализация утечек памяти").
Функции DumpAllObjectsSince и DumpStatistics выводят в окне отладчика информацию о всех выделенных объектах со времени последнего вызова Checkpoint() и информацию о состоянии динамической памяти, соответственно. Информация о памяти выводится в следующем виде:
0 bytes in 0 Free Blocks
22 bytes in 1 Object Blocks
45 bytes in 4 Non-Object Blocks
Largest number used: 67 bytes
Total allocations: 67 bytes
Первая строка показывает число блоков памяти в объектах с отложенным удалением (в MFC имеется способ сделать так, чтобы delete не удаляла объекты сразу, а откладывала бы эту процедуру до конца работы программы. Это делается для тестирования программ в условиях нехватки памяти). Вторая и третья строки показывают размер занимаемой памяти и число объектов, соответственно, порожденных и не порожденных от CОbject. Последние две строки показывают максимальный и общий размер выделенной памяти.
Для того, чтобы MFC включила в отчет о состоянии памяти имя файла и номер строки, на которой был выделен неосвобожденный объект, в программе должен присутствовать следующий код:
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
Эти строки MFC по умолчанию вставляет в исходные файлы при генерации нового проекта.
Надеюсь, этот обзор помог читателю сориентироваться в многообразии отладочных средств библиотеки MFC. Более подробную информацию по данной тематике можно найти в MSDN или исходных кодах примеров (в том числе исходных кодах самой MFC). Удачи!
Автор выражает благодарность Александру Шаргину за ценные советы и замечания.
ВОПРОС-ОТВЕТНу, господа, пришло время что-то решать… Так как мне опять не пришло ни одного ответа на вопрос, думаю что рубрика "Вопрос-Ответ", в том виде в каком она сейчас существует вам не интересна. Поэтому со следующего выпуска и вопросы, и ответы будут публиковаться одновременно. Это будет больше похоже на HOWTO.
Это все на сегодня. Пока!
Алекс Jenter [email protected] Красноярск, 2001.Программирование на Visual C++
Выпуск №40 от 15 апреля 2001 г.
Здравствуйте, уважаемые подписчики!
Сегодня я хочу сделать очень важное объявление. Важное потому, что касается рассылки в целом и непосредственно каждого из вас.
Начиная с сентября 2000 года, подписчики не переставали спрашивать меня о том, есть ли у рассылки сайт, где можно посмотреть архив выпусков и другие материалы по программированию. Сайта тогда не было, и я отвечал соответственно, что собираюсь его сделать. Он тогда планировался просто как сайт рассылки и ничего больше. Однако чуть позже у нас с Александром Шаргиным возникла идея сделать полноценный сайт для наших разработчиков. Вернее, идея эта витала в воздухе, ей была фактически пропитана каждая конференция по программированию.
И мы решили попробовать ее реализовать. Работа над этим проектом началась несколько месяцев назад, и за это время к нам примкнуло большое количество людей. Сейчас над сайтом работает целая команда.
Вы наверное уже поняли к чему я веду. ;) Но вы ошибаетесь, все еще полагая, что у рассылки теперь появился сайт. Потому что все как раз наоборот – у сайта теперь есть рассылка! Потому как сайт превратился поистине в глобальное начинание. И начинание это называется RSDN – russian software developer network.
Cайт проекта RSDN отныне и всегда доступен по адресу www.rsdn.ru или просто rsdn.ru.
В настоящий момент RSDN состоит из шести основных разделов. В будущем их число, возможно, будет увеличиваться.
• Проект RSDN. В этом разделе собраны страницы, относящиеся к сайту в целом. Новости сайта, рассылки, авторы, контактная информация – все это вы найдете в этом разделе.
• Статьи. Здесь вы найдете библиотеку статей различной тематики. Вы сможете узнать много нового про различные технологии (Win32, COM, ADO), библиотеки классов (MFC, ATL, WTL), инструменты (Visual C++) и языки программирования (C, C++).
• Вопросы и ответы (Q&A). В этом разделе собраны вопросы, которые наиболее часто задаются как начинающими, так и более продвинутыми программистами. На каждый вопрос приводится исчерпывающий ответ, сопровождаемый пояснениями, фрагментами кода, а в некоторых случаях и демонстрационным проектом.
• Форумы. В этом разделе собраны форумы по самым различным тематикам, в которых вы можете обмениваться опытом с коллегами, разбросанными по всему земному шару. Если у вас есть вопрос, задайте его, и вам непременно помогут.
• Файлы. Здесь вы найдете самые различные утилиты, библиотеки, классы, готовые компоненты и множество других полезных файлов, доступных для скачивания.
• Ресурсы. В этом разделе содержится описание самых различных ресурсов, которые помогут вам в нелегкой работе. Вас ждет огромная коллекция ссылок на другие сайты, книги на русском и иностранных языках, доступные в бумажном и электронном виде, журналы, рассылки и конференции. Словом, этот раздел может служить отправной точкой для поиска необходимой информации.
Удобная система навигации с помощью древовидного меню – вы сразу выбираете то, что нужно, не загружая при этом несколько промежуточных страниц.
Конечно, сайт еще только-только родился, и поэтому материалов на нем пока не очень много. Но база будет постоянно пополняться и, надеюсь, достаточно быстро.
Пара слов о рассылке. Рассылка теперь стала частью проекта RSDN. Это значит, что начиная со следующей недели, в ней будут публиковаться самые отборные и интересные материалы сайта, посвященные программированию на Visual C++. А уже сейчас на сайт выложен полный архив рассылки, где собраны практически все выпуски, вышедшие за время ее существования.
Что еще хочу заметить. На нашем сайте НЕТ БАННЕРОВ. Это полностью некоммерческий проект, именно поэтому вы не найдете на наших страницах никакой рекламы.
И еще – наше специальное предложение. RSDN – некоммерческий проект, и таковым и останется. Его авторы порой находятся в разных уголках Земли. Мы приглашаем и вас присоединиться к нашей команде. Мы обладаем технической возможностью разместить значительно большее количество материалов и разделов. У сайта есть хороший движок, отличный дизайн, форум, качественный хостинг, ведется разработка новых сервисов, все это будет и в вашем распоряжении, если вы решите примкнуть к RSDN. Например, вы могли бы открыть новый раздел на RSDN и стать его ведущим. Объединившись, значительно проще раскручивать и развивать ресурс.