En C , l'opérateur placement-new permet de construire des objets directement dans la mémoire allouée au préalable. Lorsque vous utilisez placement-new pour allouer un tableau, il est essentiel de tenir compte de la surcharge potentielle non spécifiée encourue par l'opération.
La norme C 11 dicte que l'expression placement-new new(buffer) T[5] appelle l'opérateur new[](sizeof(T)*5 y, buffer). Ici, y représente une valeur de surcharge non négative qui varie d'un appel à l'autre. Cette surcharge peut avoir un impact sur la taille du tampon préalloué si sa valeur est supérieure à zéro.
Considérez l'extrait de code suivant :
void* buffer = malloc(sizeof(std::string) * 10); std::string* p = ::new (buffer) std::string[10];
Sans connaissance préalable de y, il est difficile de déterminer la quantité appropriée de mémoire à allouer au tampon. Si y est supérieur à zéro, le tampon alloué peut être insuffisant.
Pour résoudre ce problème, la norme a initialement laissé la responsabilité de déterminer la surcharge aux détails de mise en œuvre. Cette incertitude obligeait souvent les développeurs à éviter d'utiliser l'opérateur new[](std::size_t, void* p) ou à implémenter leur opérateur de placement array-new pour la vérification à l'exécution.
Mise à jour
Heureusement, un rapport de défaut en 2019 a rectifié ce problème en modifiant la norme pour préciser que y est toujours nul pour l'opérateur nouveau[](std::size_t, void* p). Cet ajustement s'applique rétroactivement à toutes les versions de C , offrant un comportement d'allocation cohérent et prévisible.
Par conséquent, la détermination de la surcharge non spécifiée n'est plus nécessaire lors de l'utilisation de placement-new pour allouer des tableaux directement dans la mémoire pré-alloué. Les développeurs peuvent utiliser en toute sécurité l'opérateur new[](std::size_t, void* p) sans craindre de dépasser la taille du tampon.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!