Удаление массива указателей на функции? - PullRequest
5 голосов
/ 17 ноября 2011

Вот что я скопировал с MSDN об операторе new:

Оператор new не может использоваться для выделения функции, но может быть используется для выделения указателей на функции. Следующий пример выделяет и затем освобождает массив из семи указателей на функции, которые вернуть целые числа.

int (**p) () = new (int (*[7]) ());
delete *p;

Ну, в первой строке нет ничего странного, она выделяет массив указателей на функции, но я просто не понимаю, как вторая удаляет этот массив? Я думаю, что это должно быть:

delete[] *p;

Может кто-нибудь объяснить это?

Ответы [ 2 ]

5 голосов
/ 17 ноября 2011

Честно говоря, правильный ответ был написан в комментарии avakar . Правильный код

delete[] p;

delete *p; неверно по двум причинам:

  1. мы должны использовать delete[] для всех динамически размещаемых массивов. С помощью delete вызовет неопределенное поведение.
  2. Указатели на статические функции и функции-члены не могут быть удалены
2 голосов
/ 17 ноября 2011

Если мы добавим typedef,

typedef int (*FPtr)();

оператор new может быть переписан как

FPtr *p = new FPtr[7];

так что очевидно, что ресурс должен быть освобожден с

delete[] p;

как объяснили другие.


Кстати, на странице MSDN для VS 2008 и выше используется правильный код.

int (**p) () = new (int (*[7]) ());
delete [] p;
...