Сказка о смешении new[]
и delete
, якобы вызывающей утечку памяти, - это всего лишь сказка. Это не имеет абсолютно никакой основы в реальности. Я не знаю, откуда она взялась, но к настоящему времени она обрела собственную жизнь и выжила, как вирус, распространяясь из уст в уста от одного новичка к другому.
Наиболее вероятное обоснование этой бессмыслицы "утечки памяти" заключается в том, что с невинно наивной точки зрения разница между delete
и delete[]
заключается в том, что delete
используется для уничтожения только одного объекта, тогда как delete[]
уничтожает массив объектов («много» объектов). Наивный вывод, который обычно получается из этого, заключается в том, что первый элемент массива будет уничтожен delete
, а остальные будут сохраняться, создавая тем самым предполагаемую «утечку памяти». Конечно, любой программист, имеющий хотя бы базовое понимание типичных реализаций кучи, сразу поймет, что наиболее вероятным последствием этого является повреждение кучи, а не «утечка памяти».
Другое популярное объяснение наивной теории «утечки памяти» состоит в том, что, поскольку вызывается неправильное количество деструкторов, вторичная память, принадлежащая объектам в массиве, не освобождается. Это может быть правдой, но это, очевидно, очень вынужденное объяснение, которое не имеет большого значения перед лицом гораздо более серьезной проблемы с повреждением кучи.
Короче говоря, смешивание различных функций распределения является одной из тех ошибок, которые приводят к твердому, непредсказуемому и очень практичному неопределенному поведению . Любые попытки наложить какие-то конкретные ограничения на проявления этого неопределенного поведения - просто пустая трата времени и верный признак отсутствия базового понимания.
Нет необходимости добавлять, что new/delete
и new[]/delete[]
на самом деле являются двумя независимыми механизмами управления памятью, которые можно настраивать независимо. Как только они будут настроены (заменяя функции управления сырой памятью), абсолютно невозможно будет даже предсказать, что может произойти, если они смешаются.