Удалит ли [] с помощью void * вызовет утечку памяти?

Возможный дубликат:
Насколько это безопасно? удалить недействительный указатель?

Будет ли следующий код вызывать утечку памяти?

void *ptr = new long [10];
delete[] ptr; // note: ptr is a void*

[РЕДАКТИРОВАТЬ] Приведенный выше код сгенерирует предупреждающее сообщение во время компиляции, чтобы указать его "undefined". Я спрашиваю об этом, потому что мне интересно, как C ++ обрабатывает диапазоны памяти при вызове delete []. Я должен изменить свой вопрос, чтобы сделать его более конкретным.

Будет ли следующий код вызывать утечку памяти?

char *ptr = (char *)(new long [10]);
delete[] ptr; // note: ptr is a char*

person RichardLiu    schedule 27.04.2011    source источник
comment
Он не будет компилироваться в большинстве компиляторов, так как delete не сможет узнать, сколько памяти необходимо освободить для указателя void.   -  person Arunmu    schedule 27.04.2011


Ответы (2)


Нет. Отсутствие delete[] вызовет утечку. Кстати, это должно быть long* ptr. Я не думаю, что delete[] будет даже компилироваться с аргументом void*.

person Marcelo Cantos    schedule 27.04.2011
comment
Он может компилироваться, но результаты определенно не определены. - person James McNellis; 27.04.2011
comment
В общем, правда, но вот причуда (подчеркнутая отсутствием упоминания в тексте вопроса): он удаляет указатель void! - person Tony Delroy; 27.04.2011
comment
Да ... но похоже, что g ++ может пропустить это, только с предупреждением: удаление 'void *' не определено. Думаю, мне следует изменить свой вопрос, чтобы прояснить его. - person RichardLiu; 27.04.2011

Я пробовал следующую программу (небольшая модификация этого примера):

#include <iostream>
#include <new>
using namespace std;

struct myclass {
  myclass() {cout <<"myclass constructed\n";}
  ~myclass() {cout <<"myclass destroyed\n";}
};

int main () {
  void * pt = new myclass[3];
  delete[] pt;

  return 0;
}

с помощью g ++ и получил следующее предупреждение компиляции:

leaky.cpp: In function ‘int main()’:
leaky.cpp:13: warning: deleting ‘void*’ is undefined

И когда вы его запустите ... потерпите неудачу! Процесс умирает (недействительный указатель), когда вы пытаетесь удалить этот указатель.

person Community    schedule 27.04.2011