Поделиться через


Дампы объектов

Этот раздел применим к:

Выпуск

Visual Basic

C#

F#

C++

Web Developer

Express

Тема не применяется Тема не применяется Тема не применяется

Только машинные коды

Тема не применяется

Pro, Premium и Ultimate

Тема не применяется Тема не применяется Тема не применяется

Только машинные коды

Тема не применяется

В программе MFC можно использовать функцию CMemoryState::DumpAllObjectsSince для помещения в дамп описания всех объектов кучи, которые не были освобождены. Функция DumpAllObjectsSince помещает в дамп все объекты, размещенные с момента последней проверки состояния памяти CMemoryState::Checkpoint. Если вызова Checkpoint не было, DumpAllObjectsSince отображает все объекты и не-объекты, находящиеся в памяти на данный момент.

Примечание

Перед тем как использовать вывод объектов MFC, следует включить Практическое руководство. Включение и отключение диагностики памяти.

Примечание

MFC автоматически отображает все потерянные объекты при выходе из программы, поэтому в точке выхода не нужно создавать для этого дополнительный код.

Следующий код — тест на утечку памяти путем сравнения двух состояний памяти и отображения всех объектов, если таковая обнаружилась.

Устаревший пример кода

if( diffMemState.Difference( oldMemState, newMemState ) )
{
   TRACE( "Memory leaked!\n" );
   diffMemState.DumpAllObjectsSince();
}

Содержимое дампа выглядит следующим образом:

Dumping objects ->

{5} strcore.cpp(80) : non-object block at $00A7521A, 9 bytes long
{4} strcore.cpp(80) : non-object block at $00A751F8, 5 bytes long
{3} strcore.cpp(80) : non-object block at $00A751D6, 6 bytes long
{2} a CPerson at $51A4

Last Name: Smith
First Name: Alan
Phone #: 581-0215

{1} strcore.cpp(80) : non-object block at $00A7516E, 25 bytes long

Надежное программирование

Числа в фигурных скобках в начале большинства строк указывают порядок размещения объектов в памяти. Объект, размещенный в последнюю очередь, имеет наибольший номер и появляется вверху дампа. Подробное рассмотрение данного примера см. в разделе Интерпретация дампа объекта.

Чтобы извлечь из дампа объекта наибольшее количество сведений, можно переопределить функцию-член Dump любого объекта, производного от CObject, и с ее помощью Настройка дампа объекта.

Можно установить точку останова на определенном выделении памяти, задав глобальной переменной _afxBreakAlloc значение, показанное в фигурных скобках. При перезапуске программы отладчик остановит выполнение именно там, где происходит это выделение памяти. Теперь можно посмотреть стек вызовов и проанализировать, как программа дошла до этого места.

В библиотеке времени выполнения языка C тоже есть подобная функция, _CrtSetBreakAlloc, которая применяется для выделений памяти во время выполнения в языке C.

См. также

Другие ресурсы

Обнаружение утечек памяти в MFC