2012-06-08 2 views
2

Допустим, я выделить массив ИнтсУдалить массив из офсетной

int test[] = new int[100]; 

Я беру указатель где-то в середине

int *temp = &test[50]; 

Тогда я зову удалить [] на темп

delete[] temp 

Как компилятор знает размер элементов для удаления в этом случае?

+0

Можете ли вы объяснить обстоятельства, в которых вы хотели бы это сделать? –

+0

Если вы пытаетесь сжать массив, это невозможно сделать так. Используйте 'std :: vector', если вам нужно изменить размер. – molbdnilo

+0

Мне было интересно, есть ли у меня большой массив и нужно быстро освободить место - можно ли просто освобождать ненужные вещи, а не делать копию и освобождать оригинал ... – Makubex

ответ

8

Это не будет (или будет, я не знаю). Вы вызываете неопределенное поведение. Вам разрешено звонить только delete[] на указатель, выделенный new[].

Например, я получаю сбой в MSVS.

3

Необходимо, чтобы передать ту же ячейку памяти, которая была возвращена new[], передавая что-либо еще, является неопределенным поведением.

1

Вы не можете этого сделать. Компилятор должен отслеживать размер памяти, который он выделяет. В стандарте не говорится, как это нужно. Некоторые компиляторы хранят размер выделенной памяти непосредственно перед возвращенным адресом. В таких случаях то, что вы делаете, может привести к неопределенному поведению.

1

Ответ нет. Поскольку оператору delete необходимо определить местонахождение блока памяти и его размер, который в основном опережает первый элемент выделенного массива. вы должны взглянуть на «внутреннюю модель объекта C++»

+1

«Как компилятор узнает размер элементов удалить в этом случае? " - «Ответ - нет» :) –

+0

Спасибо за упоминание Inside C++ :) – Makubex

Смежные вопросы