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