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