Когда ты выделяешь объект с помощью new, ты никогда не должен явно вызывать деструктор. Вместо этого используй оператор delete для правильной очистки объекта.
Если ты выделяешь объект с помощью типичного выражения new:
Fred* p = new Fred();
Деструктор будет вызван автоматически, когда ты удалишь указатель:
delete p; // Автоматически вызывает p->~Fred()
Оператор delete выполняет два критически важных действия:
newЯвный вызов деструктора вроде p->~Fred() проблематичен, потому что он только запускает код очистки, но не освобождает выделенную память. Это приводит к утечке памяти.
Единственное исключение — когда ты используешь placement new, который конструирует объект в уже выделенной памяти:
void* buffer = malloc(sizeof(Fred));
Fred* p = new(buffer) Fred(); // Placement new
p->~Fred(); // Явный вызов деструктора обязателен
free(buffer); // Потом вручную освобождаешь память
В этом случае нужно явно вызвать деструктор, потому что использовать delete здесь нельзя.
Всегда используй delete для очистки объектов, выделенных через new. Это гарантирует, что очистка ресурсов через деструктор и освобождение памяти происходят вместе.
Использование delete на указателе, выделенном с помощью new, автоматически вызывает деструктор и освобождает память в одной операции.
Новый — ещё не проверен сообществом
Вы