BonBonSlick
@BonBonSlick
Vanilla Full Stack Web Architector

Деструктор елемента массива?

T *p = new T[10];
delete p;

The above code is syntactically correct and will compile fine.

The only problem is that it will just delete the first element of the array. Though the entire array is deleted, only the destructor of the first element will be called and the memory for the first element is released.


1 - создаем указатель типа Т
2 - именуем его Р
3 - создаем массив Т
4 - говорим что его размер 10 елементов (как я понял, по дефолту заполняется 1-10 числами)
5 - вызываем деструктор для указателя

Ожидаемы результат, массив уничтожен. Но по ответудален только 1-й елемент. Это пример кода из собеседований.

Доп по теме https://stackoverflow.com/questions/2425728/delete...
Согласно ответу на стеке, delete удаляет весь массив. А delete[] первый элемент, или который указали в скобках.

Почему удален только первый елемент?
  • Вопрос задан
  • 175 просмотров
Пригласить эксперта
Ответы на вопрос 2
petermzg
@petermzg
Самый лучший программист
T - может быть как Value, так и Reference типа. И от этого зависит механизм работы с данными.
Если вы напишите так
int* p = new int[10];
то вы создадите массив для хранения 10 элементов и что в таком случае значит "delete[] удалит первый элемент"?
В этом массиве удалить элемент не получиться, вы можете его только переписать записав новое значение на его место.
Если бы у вас был массив ссылок, то вы также можете только переписать ссылку. Но и можете удалить обьект на который эта ссылка ссылается.
pRef = p[0];
delete pRef;

Но тут вы никак не влияете на содержимое массива.

Поэтому delete[] удаляет ранее созданный массив целиком и только если он создан через new T[]

Update: Так как в комментариях появилось много желающих поумничать, а не уточнить/поправить.
Исправлю сам. Выше под Reference и "ссылка" понимается "Указатель (Pointer)", а не тип из C++, что называется ссылка.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы