![]() |
![]() |
|
![]() |
||||||||||||||||||
![]() |
![]() |
![]() |
||||||||||||||||
|
![]() |
|
![]() |
|
||||||||||||||
![]() |
![]() |
![]() |
Шаг 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); | | Автор Каев Артем. |
![]() |
![]() |
![]() |
|