Это не утечка памяти; это неопределенное поведение . Это намного хуже.
Вызов delete
для памяти, выделенной new[]
, может привести к повреждению кучи, что может привести к сбою приложения. Не сразу, конечно, потому что это было бы слишком полезно. Это может произойти сбой спустя некоторое время, после того, как куча была повреждена, чтобы почти невозможно отследить.
Всегда используйте delete[]
с new[]
. На самом деле, никогда не используйте new[]
для начала. Используйте std::vector
, если у вас нет особых и особых потребностей.
Я хочу знать, почему?
Почему это важно? Это неправильно и приводит к поломке программы. Это неправильно, потому что так говорит стандарт C ++.
Однако, если вы настаиваете на причине ...
Обратите внимание, что вы можете выделить любое количество предметов с помощью new[]
. Вы можете поместить любое число (aka: положительное целое число) там. Таким образом, вы можете иметь new int[50]
или new int[someIntegerVariable]
. Это все хорошо.
Также обратите внимание, что delete[]
не не считает. Ну ... как это возможно? Если вы выделяете 50 int
с, очевидно, delete
нужно знать, сколько вы выделили, верно? Но вам не нужно это говорить; это автоматически знает.
Как? Потому что new int[50]
выделяет больше , чем просто массив из 50 int
с. Он также выделяет достаточно места для хранения размера выделения. Думайте об этом, как о выделении 51 int
с, но позволяя вам использовать только 50 из них.
Затем приходит delete[]
. Он выясняет, где найти количество, выделенное new[]
. И он использует это количество для освобождения памяти.
delete
делает не делает это. Следовательно, не может правильно освободить память.