Сравнение состояний памяти
Обновлен: Ноябрь 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, чтобы разделить программу и определить место утечки способом двоичного поиска.