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 вкажуть компілятору, що ви хочете видалити не тільки покажчик, а весь масив.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*