Какова форма массива «удалить»? - PullRequest
17 голосов
/ 14 мая 2009

Когда я скомпилировал код, используя имя массива в качестве указателя, и удалил имя массива с помощью delete, я получил предупреждение об удалении массива без использования формы массива (точную формулировку не помню) .

Основной код был:

int data[5];
delete data;

Итак, что такое форма удаления массива?

Ответы [ 5 ]

45 голосов
/ 14 мая 2009

Форма удаления массива:

delete [] data;

Редактировать: Но, как отмечали другие, вам не следует звонить delete для данных, определенных так:

int data[5];

Вы должны вызывать его, только когда выделяете память, используя new, например:

int *data = new int[5];
18 голосов
/ 14 мая 2009

Вы либо хотите:

int *data = new int[5];
... // time passes, stuff happens to data[]
delete[] data;

или

int data[5];
... // time passes, stuff happens to data[]
// note no delete of data

Правило родов: применять delete только к памяти, полученной из new. Если использовалась форма массива new, то необходимо использовать форму массива delete для сопоставления. Если использовалось размещение new, то вы либо вообще не звоните delete, либо используете подходящее размещение delete.

Поскольку переменная int data[5] является статически распределенным массивом, она не может быть передана в любую форму оператора delete.

5 голосов
/ 14 мая 2009

Как уже сказал другой, вы должны использовать векторную форму удаления:

void some_func(size_t n)
{
  int* data = new int[n];

  . . . // do stuff with the array

  delete [] data; // Explicitly free memory
}

Будьте очень осторожны с этим, потому что некоторые компиляторы не будут не предупреждать вас.

Еще лучше, очень редко возникает необходимость в использовании вектора new / delete. Подумайте, можно ли изменить ваш код, чтобы использовать std :: vector:

void some_func(size_t n)
{
  std::vector<int> data(n);

  . . . // do stuff with the array

} // memory held by data will be freed here automatically

И если вы имеете дело с памятью в локальной области, рассмотрите возможность использования STLSoft ' auto_buffer , который будет выделяться из внутреннего буфера (хранится в стеке, как часть экземпляра), если это возможно, переходить в кучу, только если он не может:

void some_func(size_t n)
{
  stlsoft::auto_buffer<int, 10> data(n); // only allocates if n > 10

  . . . // do stuff with the array

} // memory held by data will be freed here automatically, if any was allocated

Читать подробнее об auto_buffer .

2 голосов
/ 14 мая 2009

Код, как показано, имеет массив либо в стеке, либо в инициализированной части сегмента данных, т.е. вы не освобождаете его (что, как упоминалось другими, будет «неопределенным поведением».) «бесплатный магазин», вы бы сделали это с delete [] data.

0 голосов
/ 14 мая 2009

Так же, как RichieHindle, описанный выше, когда вы хотите освободить пространство, динамически выделяемое для массива, обозначенного data, вы должны поместить две скобки [] между зарезервированным словом delete и указателем на начало выделенного пространство. Поскольку data может указывать на один int в памяти, а также на первый элемент в массиве, это единственный способ сообщить компилятору, что вы хотите удалить весь кусок памяти. Если вы не сделаете это правильно, поведение будет «неопределенным» (Страуструп, Язык программирования C ++ ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...