5.3.4 [expr.new]
du C++11 Fév projet donne l'exemple:
new(2,f) T[5]
résultats dans un appel d'operator new[](sizeof(T)*5+y,2,f)
.Ici, x et y sont non-négatif non spécifié les valeurs représentant le tableau d'allocation des frais généraux, le résultat de la nouvelle-expression sera compensé par ce montant de la valeur retournée par
operator new[]
. Ces frais peuvent être appliqués à l'ensemble de la matrice de la nouvelle-expressions, y compris ceux de référencement fonction de la bibliothèqueoperator new[](std::size_t, void*)
de placement et d'autres fonctions d'allocation. Le montant des frais généraux peuvent varier d'une invocation de la nouvelle à l'autre. fin de l'exemple ]
Maintenant, prenez l'exemple de code suivant:
void* buffer = malloc(sizeof(std::string) * 10);
std::string* p = ::new (buffer) std::string[10];
Selon la citation ci-dessus, la deuxième ligne, new (buffer) std::string[10]
en interne appel operator new[](sizeof(std::string) * 10 + y, buffer)
(avant la construction de l'individu, std::string
des objets). Le problème est que si y > 0
, le pré-mémoire tampon allouée sera trop petit!
Alors, comment puis-je savoir combien de mémoire de pré-allouer lors de l'utilisation de la matrice de placement-nouvelle?
void* buffer = malloc(sizeof(std::string) * 10 + how_much_additional_space);
std::string* p = ::new (buffer) std::string[10];
Ou de la norme, quelque part, de garantir que y == 0
dans ce cas? Encore une fois, la citation dit:
Ces frais peuvent être appliqués à l'ensemble de la matrice de la nouvelle-expressions, y compris ceux de référencement fonction de la bibliothèque
operator new[](std::size_t, void*)
de placement et d'autres fonctions d'allocation.