Это не утечка памяти; это undefined поведение. Это намного хуже.
Вызов delete
по памяти, выделенной new[]
, может привести к разложению кучи, что может привести к краху вашего приложения. Не сразу, конечно, потому что это было бы слишком полезно. Это может произойти когда-нибудь позже, спустя много времени после того, как куча была повреждена, что почти невозможно было отследить.
Всегда используйте delete[]
с new[]
. На самом деле, никогда не использовать new[]
для начала. Используйте std::vector
, если у вас нет особых и конкретных потребностей.
Я хочу знать почему?
Почему это имеет значение? Это неправильный и приводит к сломанной программе. Это неправильно, потому что стандарт C++ так говорит.
Однако, если вы настаиваете на причины ...
Обратите внимание, что вы можете выделить любое количество элементов с new[]
. Вы можете поместить любой счетный номер (aka: positive integer). Таким образом, вы можете получить new int[50]
или new int[someIntegerVariable]
. Все хорошо.
Также обратите внимание, что delete[]
делает не считать счет. Ну ... как это возможно? Если вы выделите 50 int
с, очевидно, delete
должен знать, сколько вы выделили, не так ли? Но вам не нужно это говорить; он автоматически знает.
Как? Потому что new int[50]
выделяет больше, чем просто массив из 50 int
s. Он также выделяет достаточно места для хранения размера выделения. Подумайте об этом как о распределении 51 int
, но разрешите использовать только 50 из них.
Затем идет delete[]
. Он определяет, где найти счет, выделенный new[]
. И он использует этот счет для освобождения памяти.
delete
нет сделаю это. Поэтому он не может правильно освободить память.
хотя это правда, это не вопрос [I * think *] - он спрашивает о том, как это реализовано. [Я согласен, вопрос был не очень ясен, прежде чем я его редактировал ...] – amit
Во-первых, спасибо. amit, прав. Я хочу знать, «как это реализовано?» –
@chinazhangjie: Я думаю, что я кратко объяснил *, как каждый реализован. Вы хотите * актуальную * реализацию? – Nawaz