Что произойдет, если вы примените delete[] к указателю, не являющемуся массивом?

Если вы примените "delete" вместо "delete[]" к массиву в C++, то вы создадите утечку памяти, потому что будет удален только первый элемент. Но что произойдет, если вы случайно примените "delete[]" к указателю, не являющемуся массивом? Например (просто игрушечный пример):

   class X {   
      void  foo()
      {
          X* x = new X();
          delete[] x; // What happens here?
      }
   };

Может ли это причинить какой-либо вред? И если да, то какой вред?

2 ответа

Если вы примените "delete" вместо "delete[]" к массиву в C++, то вы создадите утечку памяти, потому что будет удален только первый элемент.

Это не всегда так. Поскольку операторы new, new [], delete, delete [] также могут быть перегружены, использование delete вместо delete[] (или наоборот) может иметь огромное значение.

Кроме того, некоторые компиляторы используют метод перераспределения, описанный здесь. Поэтому применение delete [] к указателю, не являющемуся массивом, приводит к неопределенному поведению.

Если вы используете простой delete где delete[] требуется, у вас нет утечки памяти, у вас неопределенное поведение. Во многих случаях вы повредите арену свободного пространства, что приведет к более позднему сбою программы, но, конечно, неопределенное поведение не определено, поэтому может случиться что угодно.

С помощью delete[] где простой delete требуется также неопределенное поведение; на практике это тоже часто приводит к повреждению арены в свободном пространстве или другим неприятным последствиям.

Конечно, на практике нет контекста, который я мог бы придумать, где бы вы использовали новый массив, так что вы можете в значительной степени забыть о delete[],

Другие вопросы по тегам