В чем разница между операторами delete
и delete[]
в С++?
Delete vs delete [] в С++
Ответ 1
Оператор delete
освобождает память и вызывает деструктор для одного объекта, созданного с помощью new
.
Оператор delete []
освобождает память и вызывает деструкторы для массива объектов, созданных с помощью new []
.
Использование delete
для указателя, возвращаемого new []
или delete []
указателем, возвращаемым new
, приводит к поведению undefined.
Ответ 2
Оператор delete[]
используется для удаления массивов. Оператор delete
используется для удаления объектов без массива. Он вызывает функцию operator delete[]
и operator delete
соответственно, чтобы удалить память, занятую массивом или объектом без массива после (в конечном счете) вызова деструкторов для элементов массива или объекта без массива.
Ниже показаны соотношения:
typedef int array_type[1];
// create and destroy a int[1]
array_type *a = new array_type;
delete [] a;
// create and destroy an int
int *b = new int;
delete b;
// create and destroy an int[1]
int *c = new int[1];
delete[] c;
// create and destroy an int[1][2]
int (*d)[2] = new int[1][2];
delete [] d;
Для a new
, который создает массив (так что либо new type[]
или new
применяется к конструкции типа массива), Стандарт ищет operator new[]
в классе типа элемента массива или в глобальном scope и передает объем запрошенной памяти. Он может запросить больше, чем N * sizeof(ElementType)
, если он хочет (например, для хранения количества элементов, поэтому позже, когда удаление знает, сколько вызовов деструкторов сделано). Если класс объявляет operator new[]
, что дополнительный объем памяти принимает другой size_t
, второй параметр получит количество выделенных элементов - он может использовать это для любой цели, которую он хочет (отладка и т.д.).
Для new
, который создает объект без массива, он будет искать operator new
в классе элемента или в глобальной области. Он передает объем запрошенной памяти (ровно sizeof(T)
всегда).
При a delete[]
он просматривает тип класса элементов массивов и вызывает их деструкторы. Используемая функция operator delete[]
является той, которая находится в классе элемента, или если в глобальной области нет ни одного.
При a delete
, если переданный указатель является базовым классом фактического типа объекта, базовый класс должен иметь виртуальный деструктор (в противном случае поведение undefined). Если это не базовый класс, тогда вызывается деструктор этого класса и используется operator delete
в этом классе или глобальном operator delete
. Если базовый класс был передан, тогда вызывается деструктор фактического типа объекта и используется operator delete
, найденный в этом классе, или если его нет, вызывается глобальный operator delete
. Если operator delete
в классе имеет второй параметр типа size_t
, он получит количество элементов для освобождения.
Ответ 3
Это основное использование шаблона allocate/DE-allocate в С++ malloc/free, new/delete, new []/delete []
Мы должны использовать их соответственно. Но я хотел бы добавить это конкретное понимание для разницы между delete и delete []
1) delete используется для выделения выделенной памяти для одиночного объекта
2) delete [] используется для выделения выделенной памяти для массива объектов
класс ABC {}
ABC * ptr = новый ABC [100]
когда мы говорим, что новый [100].. компилятор может получить информацию о том, сколько объектов нужно выделить (здесь это 100) и вызовет конструктор для каждого из созданных объектов
но, соответственно, если мы просто используем удалить ptr для этого случая, компилятор не будет знать, сколько объектов, на которые указывает ptr, и в конечном итоге вызовет деструктор и удалит память только для одного объекта (оставление вызова деструкторов и освобождение оставшихся 99 объектов). Следовательно, будет утечка памяти
поэтому в этом случае мы должны использовать delete [] ptr.
Ответ 4
Операторы delete
и delete []
используются соответственно для уничтожения объектов, созданных с помощью new
и new[]
, возвращаясь к выделенной памяти, доступной для диспетчера памяти компилятора.
Объекты, созданные с помощью new
, обязательно должны быть уничтожены с помощью delete
и что массивы, созданные с помощью new[]
, должны быть удалены с помощью delete[]
.
Ответ 5
delete
используется для одного указателя, а delete[]
используется для удаления массива с помощью указателя.
Это может помочь вам лучше понять.