В чем разница между новым и новым [1]? - PullRequest
6 голосов
/ 22 сентября 2011

В чем разница между new и new[1]?Могу ли я использовать delete с new[1]?

Edit

Хорошо, я должен был предоставить фон, извините за это.Я оценивал BoundsChecker при работе с VS 2010, и он пожаловался на утечку памяти, когда использовал delete [] для new [1].Так что в теории я знаю, как использовать новую и удаляемую пару, но эта конкретная ситуация смутила меня из-за скрытых вещей.Есть идеи, что происходит?

Ответы [ 4 ]

12 голосов
/ 22 сентября 2011

Эд и Экс правы, но под капотом происходит гораздо больше.

Если вы используете new, а затем delete, вызов delete выполнит один деструктор.

Если вы используете new [], вы должны использовать delete [], но как delete [] знает, сколько деструкторов нужно вызвать? Может быть массив из 2 экземпляров или один из 2000 экземпляров? Что делают некоторые (возможно, большинство или все) компиляторы, так это сохраняют количество экземпляров непосредственно перед возвратом памяти.

Так что, если вы вызовете new [5], то new выделит память следующим образом:

+---+-----------+-----------+-----------+-----------+-----------+
| 5 | instance1 | instance2 | instance3 | instance4 | instance5 |
+---+-----------+-----------+-----------+-----------+-----------+

И вы получаете указатель обратно на instance1.

Если вы позже вызовете delete [], delete [] будет использовать номер (в данном случае 5), чтобы увидеть, сколько деструкторов нужно вызвать, прежде чем освободить память.

Обратите внимание, что если вы смешаете новое с delete [] или new [] с delete, это может пойти ужасно неправильно, потому что номер может отсутствовать или номер может быть неправильным.

Если смешивать new [1] с delete delete, возможно, вам просто повезло, но не надейтесь на это.

10 голосов
/ 22 сентября 2011

new создает экземпляр, тогда как new[1] создает одноэлементный массив. new[1] почти наверняка повлечет за собой (небольшие) накладные расходы памяти по сравнению с new для хранения размера массива. Вы не можете использовать конструкторы не по умолчанию с new[].

new должен использоваться с delete.

new[] должен использоваться с delete[].

1 голос
/ 22 сентября 2011

new [] - это оператор для выделения и инициализации массива объектов и возврата указателя на первый элемент.Это отличается от оператора new, который имеет такое же поведение, но для одного размещения, а не для массива.Для освобождения и уничтожения объекта следует использовать new с delete и new [] с delete [].

// operator new[] and new example

// create array of 5 integers
int * p1 = new int[5];
delete[] p1;

// regular allocation of one int
int * p1 = new int;
delete p1;

(подробнее см. здесь )

0 голосов
/ 22 сентября 2011

'new [1]' создает массив из одного элемента.Нужно использовать delete[] для освобождения памяти.new просто создает объект.Используйте delete с ним.

...