Опять утечка памяти. Опять отладочный класс. Мы уже с Вами говорили о этой самой утечке. "Подробности - Утечка памяти", что это такое и как она возникает. В "N/A" как вообще увидеть, что она утекает. То есть при запуске отладчика вы это видите. В "N/A", который нам поможет определить файл кода и строку где она все-таки утекает. И вот новый класс. Он нам поможет проверять была ли утечка после конкретных операций. У этого класса нет родителя. Сирота он :-)) Вы можете распределить память в программе следующими функциями.
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);