[C++] delete[]

erotic


int *a;
a = new int[10];
delete a;

Что произойдет? Обязательно ли вызывать delete[] для удаления динамического массива?

kruzer25

Что произойдет?
Память, занимаемая этими 10-ю интами, освободится
Обязательно ли вызывать delete[] для удаления динамического массива?
Да, если не хочешь утечки памяти...

erotic

в чем тогда разница между вызовами delete a и delete []a ?

lilia_rass

По-моему это один хрен.

Dasar

для int-ов без разницы
разница появляется - если элемент - это объект, например, открытый файл.
в ряде реализации - если для массива вызывается delete, вместо delete[], то будет вызван деструктор только для первого элемента (соответственно, закроется только первый файл, остальные файлы, так и останутся висеть).
ps
В последних реализациях С++, может быть, сделали, чтобы массивы в любом случае корректно уничтожались

erotic

Спасибо

daru

Что произойдет? Обязательно ли вызывать delete[] для удаления динамического массива?
Разница между delete и delete [] есть и весьма существенная. Я не помню, что говорит Стандарт на эту тему, хотя изучал этот вопрос года 2 назад. Но думаю, что undefined behavior - к гадалке не ходи.
Из реальной жизни:
приложение, испольующее что-то типа
A* a = new A[1024]l
delete a;
под виндой падает под отладчиком (VS.NET 2003) и имеет утечку памяти в 1023 объекта типа A (деструкторы тоже не вызываются, но и не падает если запущено без отладчика. Думаю, что с int'ами будет такая же песня, т.е. memleak.
На солярке такой код даст core dumped. Тоже самое, думаю, будет, если скомпилировать это при помощи gcc на практически (или вообще) любой платформе.
Так что маза всегда использовать delete [] правильно, т.е. пользоваться std::vector,

kruzer25

Думаю, что с int'ами будет такая же песня, т.е. memleak
Инт и указатель на объект - совершенно разные вещи.
В твоём примере - очищается память, используемая массивом указателей на А, и только для первого А вызывается деструктор.
Для интов - никакой деструктор для отдельного элемента вызывать не надо.
Утечки в 1023 указателей на А у тебя ведь нет

mira-bella

Что произойдет? Обязательно ли вызывать delete[] для удаления динамического массива?
да обязательно
согласно стандарту вызов delete означает undefined behaviour (неопределенное поведение т.е. все что угодно.
Оставить комментарий
Имя или ник:
Комментарий: