Какова форма массива, 'удаляют'?

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

Абсолютный код был:

int data[5];
delete data;

Так, какова форма массива, удаляют?

17
задан Sam 10 August 2014 в 14:19
поделиться

5 ответов

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

delete [] data;

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

int data[5];

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

int *data = new int[5];
46
ответ дан 30 November 2019 в 10:06
поделиться

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

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

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

Поскольку переменная int data [5] - это статически распределенный массив, его нельзя передать ни в какой форме оператора delete .

18
ответ дан 30 November 2019 в 10:06
поделиться

Показанный код имеет массив либо в стеке, либо в инициализированной части сегмента данных, то есть вы не освобождаете его (что, как упоминалось другими, было бы "undefined поведение ".) Если бы он был в" бесплатном магазине ", вы бы сделали это с помощью delete [] data .

2
ответ дан 30 November 2019 в 10:06
поделиться

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

0
ответ дан 30 November 2019 в 10:06
поделиться

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

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 .

5
ответ дан 30 November 2019 в 10:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: