Мне хорошо известно, что в С++, что delete[]
соответствует new[]
, delete
соответствует new
. Речь идет не о синтаксисе С++. Мне интересно, почему причины delete[]
были определены как нечто отличное от простого delete
. Каковы причины реализации этого?
Рассмотрим, что происходит с этим кодом:
MyClass *object = new MyClass;
delete object;
Когда встречается delete
, менеджер памяти должен искать значение указателя объекта в своей структуре распределения, независимо от того, что он есть, и помечать соответствующий блок памяти sizeof(MyClass)
как свободный.
Теперь рассмотрим, что происходит с этим кодом:
MyClass *array = new MyClass[ num_objects ];
delete [] array;
Когда встречается delete
, менеджер памяти должен искать значение указателя массива в своей структуре распределения, независимо от того, что это такое, найти num_objects
значение из этой структуры и пометить соответствующий num_objects*sizeof(MyClass)
фрагмент памяти как бесплатный.
Помимо num_objects
предполагается 1 в одном объекте и просматривается во внутренней структуре данных в массиве, я не вижу разницы. Итак, почему delete
и delete[]
не могли быть написаны одинаково?
Другими словами, что не так с
MyClass *object = new MyClass;
реализуется как
MyClass *object = new MyClass[1];
так что синтаксис С++ не должен делать различия между delete
и delete[]
?