Я выделяю память, которая позже будет использоваться для построения объектов с размещением new
, Должен ли я использовать operator new(n)
или я должен использовать new unsigned char[n]
? Зачем?
Факторы:
new[]
должны соответствовать delete[]
/ new()
с delete
operator new(n)
это запрос памяти для неопределенных целей, тогда как new unsigned char[n]
слабо подразумевает намерение хранить символы там.Форма массива может быть немного худшая производительность / эффективность — точные детали в зависимости от вашей реализации:
5.3.4 / 12 new T [5] приводит к вызову оператора new, где x — неотрицательное неопределенное значение, представляющее издержки выделения массива: результат new-expression будет смещен на эту величину из значения, возвращенного
operator new[]
….
Кстати, ни то, ни другое не инициализировано:
operator new()
возвращает void*
для неинициализированной памяти: см. 3.7.4.1/2 «Нет ограничений на содержимое выделенного хранилища при возврате из функции выделения», тогда как в 5.3.4 / 15 говорится «новое выражение, которое создает объект типа T, инициализирует этот объект следующим образом: если новый инициализатор опущен, объект инициализируется по умолчанию (8.5) «; 8.5 / 6 говорит, что только конструкторы типов классов по умолчанию обеспечивают инициализацию.Первый возвращает указатель на некоторую область памяти. Последний возвращает указатель на первый элемент массива с некоторыми объекты в этом. Если вам нужно хранилище, используйте тот, который дает хранилище, а не объекты.