Новое размещение массива требует неопределенных накладных расходов в буфере?

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 *) и другие функции распределения размещения.

62
задан R. Martinho Fernandes 4 January 2012 в 03:02
поделиться