Delete (C++)
В мові програмування C++, оператор delete звільняє пам’ять, виділену раніше із купи, за допомогою оператора new. [1] Якщо як аргумент виступає об’єкт класу, то викликається деструктор. Оператор delete
слід використовувати тільки для вказівників на область пам’яті, яка була виділена за допомогою оператора new
. Після виклику оператора delete вказівник на область пам’яті де містився об’єкт стає недійсним, і його не можна використовувати далі в програмі. Зазвичай після звільнення пам’яті, програмісти присвоюють значення 0 (нульовий вказівник) вказівнику, щоб уникнути програмних помилок. Слід відмітити, що видалення нульового вказівника не має ніяких наслідків (якщо використовується функція деалокації із стандартної бібліотеки [2]), тому не обов’язково перевіряти чи вказує на null вказівник, перед викликом оператора delete
.
У C++11 ключове слово delete
також використовується для позначення функцій, які заборонені до використання (наприклад, конструктор копіювання).
Основні відмінності між delete і free()
delete
використовується сумісно з оператором new, який викликає конструктори об’єктів. В той час якfree()
використовується з функцієюmalloc()
, яка не створює об’єктів, а просто виділяє програмі частину пам’яті з кучі.
delete
викликає деструктори об’єктів, а функціяfree()
ні.
- Оскільки
delete
це оператор, його можна перевизначити для класу, а передбаченого механізму як перевизначити функціюfree()
не існує.
- Не можна звільняти пам’ять, яка була виділена функцією
malloc()
, за допомогою оператораdelete
, лише за допомогоюfree()
, і навпаки.
Можливі помилки
Якщо викликати оператор delete
для стекового об’єкту, це може призвести до непередбачуваної поведінки програми - до помилки, яку важко відслідкувати. Справа в тому, що оператор new
записує в пам’ять допоміжну інформацію перед адресою, що повертається. В цих допоміжних інформаційних байтах вказується розмір виділеного блоку. Ці допоміжні байти допомагають оператору delete
визначити скільки пам’яті за вказаною адресою слід звільнити. Якщо використати оператор delete
для стекового об’єкту, він може інтерпретувати вміст стеку перед вашою змінною як розмір блока для вивільнення пам’яті.
C++11
У C++11 delete
має також інше значення — позначення заборонених до використання функцій.[3] Наприклад, поширена ідіома "заборона копіювання" із використанням C++11 виглядає так:
class X {
// ...
X& operator=(const X&) = delete; // Забороняємо копіювання
X(const X&) = delete;
};
delete
можна застосовувати до будь-якої функції. Для прикладу, можна заборонити небажане приведення типу наступним чином:
struct Z {
// ...
Z(long long); // можлива ініціалізація типом long long
Z(long) = delete; // але не будь-яким іншим
};
Примітки
- operator delete. Cppreference.com. Процитовано 13 січня 2011.
- http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#348
- C++11 FAQ. www.stroustrup.com (англ.). Процитовано 27 квітня 2017.
Література
- Герберт Шилдт - Полный справочник C++
- Липпман, C++ для начинающих
- «С++ for real programmers», Джефф Елджер