5.3.4 [expr.new]
черновика C ++ от 11 февраля дает пример:
new (2 , f) T [5]
приводит к вызовуоператора new [] (sizeof (T) * 5 + y, 2, f)
.Здесь x и y - неотрицательные неопределенные значения, представляющие накладные расходы на выделение массива; результат new-expression будет смещен на эту величину из значения, возвращаемого оператором
new []
. Эти накладные расходы могут применяться во всех выражениях массива new-expression , включая те, которые ссылаются на библиотечную функцию, оператор new [] (std :: size_t, void *)
и другие функции размещения. Сумма накладных расходов может варьироваться от одного вызова нового к другому. —end example ]
Теперь возьмем следующий пример кода:
void* buffer = malloc(sizeof(std::string) * 10);
std::string* p = ::new (buffer) std::string[10];
Согласно приведенной выше цитате, вторая строка new (buffer) std :: string [10]
будет внутренне вызовите оператор new [] (sizeof (std :: string) * 10 + y, buffer)
(перед созданием отдельных объектов std :: string
). Проблема в том, что если y> 0
, предварительно выделенный буфер будет слишком мал!
Итак, как мне узнать, сколько памяти нужно предварительно выделить при использовании нового размещения массива?
void* buffer = malloc(sizeof(std::string) * 10 + how_much_additional_space);
std::string* p = ::new (buffer) std::string[10];
Или стандарт где-то гарантирует, что y == 0
в этом случае? И снова цитата гласит:
Эти накладные расходы могут применяться ко всем массивам new-expression , включая те, которые ссылаются на библиотечную функцию
, оператор new [] (std :: size_t, void *)
и другие функции распределения размещения.