Дампы объектов
Обновлен: Ноябрь 2007
Этот раздел применим для следующих версий.
Выпуск |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Экспресс-выпуск |
Только машинные коды |
|||
Standard |
Только машинные коды |
|||
Pro и Team |
Только машинные коды |
Условные обозначения:
Применимо |
|
Неприменимо |
|
Команда или команды по умолчанию скрыты. |
В программе 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.