Шаг 65 - Ловим утечку памяти

Создание проекта

Создаем проект WIN 32 Console с поддержкой MFC.

Создаем код

#include "stdafx.h"
#include "afxwin.h"
class CTestMy // наш класс
{
public:
CTestMy();
private:
CPoint *cp;
};
CTestMy::CTestMy()
{
cp = new CPoint(); // в конструктре класса новый обьект
};
void main()
{
CTestMy my; // Новый обьект
CTestMy my2; // Новый обьект
}

Описание

Как видите в этот код и реализацию класса я специально включил ошибку. Да специально. Но каждый, наверно, программист включает ошибку совсем не специально. Проблема потери памяти при написании программ очень большая. Конечно, её можно проверить. Если запустить программу на компьютере с ограниченной оперативной памятью и совместно с многими программами. Но если Вы пишете программы, то памяти у Вас девать некуда? Правда? К чему может привести, если Ваша программа выделяет память, но не полностью её освобождает ? К чему угодно вплоть до краха Вашей операционной системы. Самая распространенная ошибка это выделение памяти оператором new и не освобождение её delete. Именно для избежания этой ситуации и было предусмотрено создание конструкторов и деструкторов. Но кто из нас не ошибается ?

В отладочные функции VC++ и DevStudio входит и возможность слежения за распределением памяти. Соберите и запустите этот проект в отладочном варианте Start Debug-> Go (F5).

65_1.gif (2733 b)

После выполнения программы загляните в окно отладки внизу Debug. В конце вы должны увидеть записи подобные приведенным ниже.

Detected memory leaks!		// Утечка памяти !!!!
Dumping objects ->
{34} normal block at 0x008A0B90, 8 bytes long.
Data: < > CD CD CD CD CD CD CD CD
{33} normal block at 0x008A0B60, 8 bytes long.
Data: < > CD CD CD CD CD CD CD CD Object dump complete.

Основано это на том, что операторы delete и new сопоставляются в конце работы программы. Еще один пример не вызывающий сообщений при компиляции, но с утечкой памяти.

class CTestMy
{
public:
CTestMy();
~CTestMy();
private:
CPoint *cp[3];
};
CTestMy::~CTestMy()
{
delete cp[1];
}
CTestMy::CTestMy()
{
cp[1] = new CPoint();
cp[2] = new CPoint();
cp[3] = new CPoint();
};
void main()
{
CTestMy my;
}

Шпаргалка

Утечку памяти можно отследить в отладочном режиме.


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 7.11.99 (обновлено 20.07.2001)