Шаг 235 - CMemoryState

Опять утечка памяти. Опять отладочный класс. Мы уже с Вами говорили о этой самой утечке. "Подробности - Утечка памяти", что это такое и как она возникает. В "Шаг 65 - Ловим утечку памяти" как вообще увидеть, что она утекает. То есть при запуске отладчика вы это видите. В "Шаг 228 - DEBUG_NEW", который нам поможет определить файл кода и строку где она все-таки утекает. И вот новый класс. Он нам поможет проверять была ли утечка после конкретных операций. У этого класса нет родителя. Сирота он :-)) Вы можете распределить память в программе следующими функциями.

Win API LocalAlloc 	LocalFree 
	GlobalAlloc	GlobalFree
Библиотечными функциями
	malloc		free 
ну и операторами С++
	new		delete

У этого класса есть конструктор:

CMemoryState( );

Умеет сохранять снимок памяти с помощью функции Checkpoint. Этот снимок в последствии используется функциями Difference и DumpAllObjectsSince.

void Checkpoint( );

Сравнивает данные из конрольных точек с текущими для выяснения утекла все-таки она или нет :-) Имя ей Difference. Возвращает ноль, если одинаковое состояние, и отличное от нуля значение если состояние памяти изменилось.

BOOL Difference( 
const CMemoryState& oldState,  // старое состояние
const CMemoryState& newState   // новое состояние
);

Есть еще одна функция DumpAllObjectsSince. Она вызывает небезызвестную нам функцию Dump для всех распределенных в памяти объектов порожденных от CObject. Вот если снимка памяти нет, то покажутся все объекты в памяти.

void DumpAllObjectsSince( ) const;

А для получения информации о состоянии распределнных объектов есть функция DumpStatistics.

void DumpStatistics( ) const;

Давайте посмотрим чем нам это поможет. Вот пример кода. Самый простой. Сняли снимок памяти. Выделили новую память. Не удалили. Сделали новый снимок и сравнили.

#include "stdafx.h"
#include "afxwin.h"

void main()
{
#if defined _DEBUG
	CMemoryState cm1;
	cm1.Checkpoint();
#endif
	CPoint *p;
	p=new CPoint(1,1);
#if defined _DEBUG
	CMemoryState cm2;
	cm2.Checkpoint();
	if (cm2.Difference(cm2,cm1))
	{
		cm1.DumpStatistics();
	}
#endif
}

А вот и результат. В окне Debug:

0 bytes in 0 Free Blocks.
0 bytes in 0 Normal Blocks.
4278 bytes in 18 CRT Blocks.
0 bytes in 0 Ignore Blocks.
64 bytes in 1 Client Blocks.
Largest number used: 4342 bytes.
Total allocations: 4956 bytes.

Можете изменить код и посмотреть действие на malloc. Все работает.

char *p;
p=(char*)malloc(1);

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.