delete []
знает размер, который был выделен. Однако эти знания хранятся во время выполнения или в диспетчере памяти операционной системы, что означает, что они недоступны компилятору во время компиляции. И sizeof()
не является реальной функцией, она фактически вычисляется константой как константа, что не может быть сделано для динамически размещаемых массивов, размер которых неизвестен во время компиляции.
Также рассмотрим этот пример:
int *arr = new int[256];
int *p = &arr[100];
printf("Size: %d\n", sizeof(p));
Как компилятор узнает, каков размер p
? Корень проблемы в том, что массивы в C и C ++ не являются объектами первого класса. Они распадаются на указатели, и у компилятора или самой программы нет возможности узнать, указывает ли указатель на начало фрагмента памяти, выделенного new
, или на отдельный объект, или на какое-то место в середине. части памяти, выделенной new
.
Одной из причин этого является то, что C и C ++ оставляют управление памятью программисту и операционной системе, поэтому у них нет сборки мусора. Реализация new
и delete
не является частью стандарта C ++, поскольку C ++ предназначен для использования на различных платформах, которые могут управлять своей памятью совершенно по-разному. Может быть возможно позволить C ++ отслеживать все выделенные массивы и их размеры, если вы пишете текстовый процессор для Windows, работающий на новейшем процессоре Intel, но это может быть совершенно невозможно при написании встроенной системы, работающей на DSP.