www.adept7.kiev.ua
| Форум| Гостевая| Ссылки| Программы| Исходные тексты| Наши партнеры.|
   
| Главная| Рассылки| Услуги| Библиотека| Новости| Авторам| Программистам| Студентам|
delphi c++ assembler
  http://tikitak.narod.ru ---- Главная страница сайта

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

Создаем проект

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

Создаем код

#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). После выполнения программы загляните в окно отладки внизу 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 сопоставляются в конце работы программы.

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

#include "afxwin.h"

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;
}


Предыдущий Шаг | Следующий Шаг | Оглавление

By Artem.
Используются технологии uCoz
 

Rambler's Top100 Rambler's Top100

©  Adept Design Studio

Используются технологии uCoz