Нет, ты обязательно должен использовать delete[] при удалении динамически выделенных массивов, даже если они содержат встроенные типы как char или int. Это правило применяется везде — без исключений.
Многие программисты ошибочно думают, что [] нужен только для вызова деструкторов элементов массива. Так как встроенные типы не имеют деструкторов, они считают, что delete без скобок безопасен. Это предположение опасно и неверно.
Когда ты используешь delete p вместо delete[] p, вызываются разные функции:
delete p вызывает operator delete(void*)delete[] p вызывает operator delete[](void*)Хотя стандартная реализация operator delete[] делегирует вызов operator delete, программисты могут переопределить эти операторы независимо друг от друга. Если есть пользовательская реализация, в которой operator delete[] работает иначе, чем operator delete, использование неправильного синтаксиса приведёт к ошибкам во время выполнения или повреждению памяти.
void userCode(int n) {
char* p = new char[n];
// ... используй массив ...
delete p; // ОШИБКА! Приводит к неопределённому поведению
// delete[] p; // ПРАВИЛЬНО!
}
Всегда сопоставляй выделение памяти с соответствующим освобождением:
new → deletenew[] → delete[]Такой подход предотвращает скрытые сбои во время выполнения и гарантирует корректную работу кода даже при наличии пользовательских операторов управления памятью. Исключений в зависимости от типа данных нет — правило применяется универсально.
Использование delete вместо delete[] на динамически выделенном массиве int безопасно, потому что int — встроенный тип без деструктора.
Новый — ещё не проверен сообществом
Вы