Delete (C++)

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

В мові програмування C++, оператор delete звільняє пам’ять, виділену раніше із купи, за допомогою оператора new. [1] Якщо в якості аргументу виступає аргумент класу, то викликається деструктор. Оператор delete слід використовувати тільки для покажчиків на область пам’яті, яка була виділена за допомогою оператора new. Після виклику оператора delete покажчик на область пам’яті де містився об’єкт стає не дійсним, і його не можна використовувати далі в програмі. Зазвичай після звільнення пам’яті, програмісти присвоюють значення 0 (нульовий вказівник) покажчику, щоб уникнути програмних помилок. Слід відмітити, що видалення нульового покажчика не має ніяких наслідків (якщо використовується функція деалокації із стандартної бібліотеки [2]), тому не обов’язково перевіряти чи вказує на null покажчик, перед викликом оператора delete.

Синтаксис[ред.ред. код]

int *p_var = null;  // новий покажчик
p_var = new int;    // динамічне виділення пам’яті
 
/* .......
інший код
........*/
 
delete p_var;       // звільнення пам’яті. 
p_var = null;       // присвоюємо нульовий покажчик

Масиви, пам’ять під яких виділяється за допомогою оператора new [], так само можна видалити за допомогою оператора delete []:

int size = 10;
int *p_var = null;       // новий покажчик
p_var = new int [size];  // динамічне виділення пам’яті
 
/* .......
інший код
........*/
 
delete [] p_var;         // звільнення пам’яті. 

p_var = null;            // присвоюємо нульовий покажчик

Основні відмінності між delete і free()[ред.ред. код]

  • delete використовується сумісно з оператором new, який визиває конструктори об’єктів. В той час як free() використовується з функцією malloc(), яка не створює об’єктів.
  • delete визиває диструктори об’єктів, а функція free() ні.
  • Оскільки delete це оператор, його можна переоприділити для класу, а передбаченого механізму як переоприділити функцію free() не існує.
  • Не можна звільняти пам’ять, яка була виділена функцією malloc(), за допомогою оператора delete, лише за допомогою free(), і навпакти.

Можливі помилки[ред.ред. код]

Якщо визвати оператор delete для стекового об’єкту, це може призвести до непередбачуваної поведінки програми - до помилки, яку важко відслідити. Справа в тому, що оператор new записує в пам’ять допоміжну інформацію перед адресою, що повертається. В цих допоміжних інформаційних байтах вказується розмір виділеного блоку. По ній оператор delete визначає скільки пам’яті по вказаній адресі слід звільнити. Якщо використати оператор delete для стекового об’єкту, можливо вміст стеку вашої змінної він інтерпретує як розмір блока для звільнення пам’яті.

Примітки[ред.ред. код]

  1. operator delete. Cppreference.com. Процитовано 13 January 2011. 
  2. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#348

Література[ред.ред. код]

  1. Герберт Шилдт - Полный справочник C++
  2. Липпман, C++ для начинающих
  3. «С++ for real programmers», Джефф Елджер

Див. також[ред.ред. код]