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


Сравнение состояний памяти

Обновлен: Ноябрь 2007

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

Выпуск

Visual Basic

C#

C++

Web Developer

Экспресс-выпуск

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

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

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

Standard

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

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

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

Pro и Team

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

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

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

Обозначения:

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

Применяется

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

Неприменимо

Тема применяется, но команда по умолчанию сокрыта

Команда или команды скрытые по умолчанию.

Другая технология для обнаружения утечек памяти включает получение "снимков" состояния памяти приложения в ключевых точках. Библиотека CRT предоставляет тип структуры _CrtMemState, который можно использовать для хранения снимков состояния памяти:

_CrtMemState s1, s2, s3;

Чтобы получить снимок состояния памяти в заданной точке, передайте структуру _CrtMemState функции _CrtMemCheckpoint. Функция поместит в структуру снимок текущего состояния памяти:

_CrtMemCheckpoint( &s1 );

Содержимое структуры _CrtMemState можно вывести в любой точке программы, передавая эту структуру функции _CrtMemDumpStatistics:

_CrtMemDumpStatistics( &s1 );

Эта функция выводит дамп сведений о выделении памяти, который выглядит примерно таким образом:

0 bytes in 0 Free Blocks.
0 bytes in 0 Normal Blocks.
3071 bytes in 16 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 3071 bytes.
Total allocations: 3764 bytes.

Чтобы определить, произошла ли утечка памяти на отрезке кода, можно сделать снимок состояния памяти перед ним и после него, а затем сравнить оба состояния с помощью функции _CrtMemDifference:

_CrtMemCheckpoint( &s1 );
// memory allocations take place here
_CrtMemCheckpoint( &s2 );

if ( _CrtMemDifference( &s3, &s1, &s2) )
   _CrtMemDumpStatistics( &s3 );

Как понятно из названия, _CrtMemDifference сравнивает два состояния памяти (s1 и s2), результатом (s3) является различие между ними. Помещение вызова _CrtMemCheckpoint в начало и конец программы и применение _CrtMemDifference для сравнения результатов — еще один способ обнаружения утечек памяти. Если утечка обнаружена, можно вызвать _CrtMemCheckpoint, чтобы разделить программу и определить место утечки способом двоичного поиска.

См. также

Основные понятия

Обнаружение и изоляция утечек памяти