5.3.4 [expr.new] of the C++11 Feb draft gives the example:
new(2,f) T[5]results in a call ofoperator new[](sizeof(T)*5+y,2,f).Here, x and y are non-negative unspecified values representing array allocation overhead; the result of the new-expression will be offset by this amount from the value returned by
operator new[]. This overhead may be applied in all array new-expressions, including those referencing the library functionoperator new[](std::size_t, void*)and other placement allocation functions. The amount of overhead may vary from one invocation of new to another. —end example ]
Now take the following example code:
void* buffer = malloc(sizeof(std::string) * 10);
std::string* p = ::new (buffer) std::string[10];
According to the above quote, the second line new (buffer) std::string[10] will internally call operator new[](sizeof(std::string) * 10 + y, buffer) (before constructing the individual std::string objects). The problem is that if y > 0, the pre-allocated buffer will be too small!
So how do I know how much memory to pre-allocate when using array placement-new?
void* buffer = malloc(sizeof(std::string) * 10 + how_much_additional_space);
std::string* p = ::new (buffer) std::string[10];
Or does the standard somewhere guarantee that y == 0 in this case? Again, the quote says:
This overhead may be applied in all array new-expressions, including those referencing the library function
operator new[](std::size_t, void*)and other placement allocation functions.