меня беспокоит то, что на самом деле делает delete []
1003 *
Вы не должны беспокоиться о том, что на самом деле делает delete[]
.По сути, это черный ящик с определенными правилами правильного использования.Единственный раз, когда вам нужно беспокоиться о том, что он должен делать на самом деле, - это если вы пишете компилятор или среду выполнения C ++ (например, операционные системы и т. Д.)
В отношении этих "определенных правил о том, какиспользуйте его правильно ", тесты № 2 и № 4 вызывают неопределенное поведение:
Стандарт ISO C ++ 2003 5.3.5 Удалить [expr.delete]
1 Оператор удаления выражения уничтожает наиболее производный объект (1.8) или массив, созданный новым выражением.
delete-expression:
::opt delete cast-expression
::opt delete [ ] cast-expression
Первая альтернатива для немассив объектов, а второй для массивов.Операнд должен иметь тип указателя или тип класса, имеющий одну функцию преобразования (12.3.2) в тип указателя.Результат имеет тип void.
2 Если операнд имеет тип класса, операнд преобразуется в тип указателя путем вызова вышеупомянутой функции преобразования, и используется преобразованный операндвместо исходного операнда для оставшейся части этого раздела.В любом из вариантов, если значение операнда удаления является нулевым указателем, операция не имеет никакого эффекта.В первом варианте (объект удаления) значение операнда удаления должно быть указателем на объект, не являющийся массивом, или указателем на подобъект (1.8), представляющий базовый класс такого объекта (раздел 10).Если нет, поведение не определено. Во втором варианте (массив массива) значение операнда удаления должно быть значением указателя, полученным из предыдущего выражения new-выражения массива.Если нет, поведение не определено. [Примечание: это означает, что синтаксис выражения удаления должен соответствовать типу объекта, выделенного new, а не синтаксису выражения new.]
«Неопределенное поведение» означает, что может случиться что угодно , включая поведение, которое вы только что описали.
Эти выражения, которые вы имеете в Тестах № 2 и #4 нарушают 5.3.5 / 2 и приводят к неопределенному поведению (Тест № 3 также вызывает неопределенное поведение, но по другой причине).
d = new int[10];
delete [](d + 5);
Строка delete[]
нарушает 5.3.5/ 2 потому что значение указателя, которое вы передаете delete[]
, не совпадает со значением, которое было вам дано из new int[]
.
Так что если команда new int[]
дает вам 0xA01D2CE9
, и вы передаете 0xA01D2CE9 + 5
до delete[]
, вы не можете рассуждать или предсказывать, что произойдет, потому что вы нарушили правила языка .Что на самом деле произойдет, будет зависеть от того, как компилятор и / или операционная система обрабатывает new[]
и delete[]
.Это может варьироваться от ничего плохого до полной поломки вашей системы, и везде между ними.
Другими словами, просто не пишите такие вещи, как delete [](d + 5);
.