C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 235 - CMemoryState / MFC шаг за шагом / Visual C++

Шаг 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);

| |
Автор Каев Артем.
[AD]