Программирование на 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 и стать его ведущим. Объединившись, значительно проще раскручивать и развивать ресурс.