[expr.new]C ++112月ドラフトの5.3.4に例を示します。
new(2,f) T[5]の呼び出しになりoperator new[](sizeof(T)*5+y,2,f)ます。ここで、xとyは、配列割り当てのオーバーヘッドを表す非負の未指定の値です。new-expressionの結果は、によって返される値からこの量だけオフセットされ
operator new[]ます。このオーバーヘッドは、ライブラリ関数やその他の配置割り当て関数を参照するものを含む、すべての配列の新しい式に適用される可能性があります。operator new[](std::size_t, void*)オーバーヘッドの量は、newの呼び出しごとに異なる場合があります。—例を終了]
次に、次のサンプルコードを使用します。
void* buffer = malloc(sizeof(std::string) * 10);
std::string* p = ::new (buffer) std::string[10];
上記の引用によると、2行目は(個々のオブジェクトを作成する前に)new (buffer) std::string[10]内部的に呼び出します。問題は、の場合、事前に割り当てられたバッファが小さすぎることです。operator new[](sizeof(std::string) * 10 + y, buffer)std::stringy > 0
では、配列配置を使用するときに事前に割り当てるメモリの量をどのように知ることができますか?
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*)