Нижегородский файловый портал
RSS - каналы
Главное меню
Категории каталога
Мои статьи [5]
Школа покера [5]
Софт [40]
Радиолюбителям и электрикам [8]
Интернет [167]
Система [89]
Комплектующие ПК [47]
Безопасность [56]
Программирование [18]
Веб-дизайнеру [5]
Игры [6]
Полезные советы [24]
Кулинария [1]
Телефония [10]
Мобильник [17]
Планшеты [14]
Медицина [5]
Работа [4]
Домашнему мастеру [0]
Строительство и ремонт [19]
Для сада и огорода [2]
Юмор и приколы [12]
Интересное [114]
Пластики [3]
Разное [238]
Мини-чат
Правила мини-чата



Мини-чат в окне
Погода в Нижнем
Яндекс.Погода
Главная » Статьи » Программирование

Visual C++: Утечка памяти

При создании любой программы очень важно правильно и рационально управлять памятью компьютера, которая есть у нас в распоряжении. Прежде всего, отмечу, что при написании программ в С++ используются два типа памяти: СТЕК (stack) и КУЧА (heap).

О стеке не стоит думать вообще, так как он очищается автоматически, а вот о куче надо заботиться программистам. Если, конечно, вы начинающий программист, то ваши программы не так велики и существует небольшая вероятность, что в вашей куче не останется места. Но для того, чтобы быть профессионалом, будучи ещё новичком, надо знать в каких ситуациях следует очищать кучу.

Посмотрим на следующий код:

void f ()
{
int A1[10];
int *A2=new int[5];
......
}

В нашей функции f() создаётся локальный указатель А2, который указывает на массив, размер которого достаточен для того, чтобы сохранить 5 переменных типа integer. Таким образом, автоматически выделяется место в памяти. При этом надо учесть, что когда мы создаём динамические переменные, память выделяется всегда только в куче.

Чтобы вернуть занятую память назад, следует добавить всего лишь одну строчку кода в нашу функцию:

delete[] A2;

Не забудьте, что данная строчка должна быть ни где-либо, а внутри функции, которая создаёт локальную переменную!

Что случится, если мы не позаботимся о памяти ? Ничего особенного, если у нас только одна такая функция, а если у нас подобных функций 100 или больше.

Просто в куче не останется места для выполнения всех наших операции и программа не будет работать.

Как только закончится функция f(), все локальные переменные будут удалены, А2 больше не будет существовать, но то место в куче так и будет занято и очистить его не будет никакой возможности (исключение, если вы создадите глобальную переменную "global").

Посмотрим ещё на один пример:

class C1{
public:
C1(int size){a1=new int[size];}
~C1(){delete [] a1;}
private:
int * a1;
......
}

В конструкторе класса С1 создаётся массив, размер которого не уточняется, и может быть любым, и сколько раз будет вызываться конструктор тоже неизвестно. Таким образом, непременно в деструкторе, который автоматически вызывается в конце программы, надо очищать кучу.

Следует запомнить, ВСЕГДА КОГДА КОНСТРУКТОР ВЫДЕЛЯЕТ ДИНАМИЧЕСКУЮ ПАМЯТЬ, ДЕСТРУКТОР ДОЛЖЕН ЕЁ ОЧИЩАТЬ !

И ещё одна небольшая ремарка, если Вы в деструкторе поместите следующий код:

delete a1;

Не будет никакой ошибки и возможно программа будет работать просто замечательно. Но следует учесть, что Вы не очистили свою память в куче. Вы удалили всего лишь указатель а1. Квадратные скобки [] перед delete укажут компилятору, что вы хотите удалить не только указатель, а весь массив.

Добавил: Админ-21NN | Просмотров: 1634 | Рейтинг: 5.0/1


Обратите Ваше внимание на другие статьи:

Уважаемые пользователи, пожалуйста, оставляйте комментарии! Нам очень важно Ваше мнение!
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.

    
Меню пользователя
Аватар гостя

Приветствуем Вас, Гость

Логин:
Пароль:
Поиск по сайту
Поиск по названию
Поиск по тегам
Горячие темы форума
Зарабатываем деньги
Детская игра Подарки...
Тест скорости подклю...
кое что о Windows
Кто ты, человек?
Новая валюта портала
Все о сексе
"Что мешает нам...
Культура
Афоризмы
Лучшие 13 анекдотов ...
как защитить свой ко...
поговорим о софте
восстановление данны...
Я ненавижу Дом-2
Волга-Телеком
Кулинария "Кокт...
Стол заказов
Жалобы
С Днем Победы!!!
Прикольные картинки
С праздником Пасхи !...
Статистика
Новых за месяц: 141
Новых за неделю: 46
Новых вчера: 6
Новых сегодня: 3
Всего: 5352
Из них:
Администраторов: 3
$$$-Модераторов: 1
Модераторов: 3
Прокураторов: 3
-----------------
далее:
Проверенных: 247
Пользователей: 2884
Новичков: 1918
Заблокированных: 100
-----------------
Из всех пользователей:
Мужчин и парней: 4187
Женщин и девушек: 1164
Именинники
Поздравляем с Днем рожденья:

DrHouse2004(31), FaNtA_ZiA(20), Denj42(35), cenation(18), adapters(22), Gun163(26), SERGNSS(57)
Режим ON-LINE
Онлайн всего: 6
Гостей: 6
Пользователей: 0

Сейчас на портале:
Наша кнопочка
Нижегородский файловый портал

HTML-код кнопки:
Реклама
Размещение рекламы

Яндекс.Метрика
Регистрация сайта в каталогах, раскрутка и оптимизация сайта, контекстная реклама Ремонт холодильников в Нижнем Новгороде

Copyright © BankRemStroy © 2009-2017