Чтение онлайн

ЖАНРЫ

Программирование на Visual C++. Архив рассылки

Jenter Алекс

Шрифт:

Класс 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 jenter@mail.ru Красноярск, 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). В этом разделе собраны вопросы, которые наиболее часто задаются как начинающими, так и более продвинутыми программистами. На каждый вопрос приводится исчерпывающий ответ, сопровождаемый пояснениями, фрагментами кода, а в некоторых случаях и демонстрационным проектом.

• Форумы. В этом разделе собраны форумы по самым различным тематикам, в которых вы можете обмениваться опытом с коллегами, разбросанными по всему земному шару. Если у вас есть вопрос, задайте его, и вам непременно помогут.

Поделиться с друзьями: