Array Placement-New : Comprendre l'impact d'une surcharge non spécifiée
La norme C exige que les nouvelles expressions de placement de tableau puissent entraîner une surcharge non spécifiée dans le tampon alloué. Cette surcharge, représentée par les variables x et y, peut varier entre les différentes invocations de new.
Considérez l'exemple de code :
void* buffer = malloc(sizeof(std::string) * 10); std::string* p = ::new (buffer) std::string[10];
Selon la norme, l'expression placement-new new ( buffer) std::string[10] appellera en interne l'opérateur new[](sizeof(std::string) * 10 y, buffer).
Cependant, cela soulève un souci : si y est supérieur à 0, le tampon tampon pré-alloué peut être trop petit, entraînant une erreur d'exécution.
Comment pour déterminer la taille de tampon requise
La norme ne garantit pas que y sera toujours égal à 0. Pour garantir que le tampon pré-alloué est suffisant, vous pouvez calculer manuellement les frais généraux supplémentaires requis. Malheureusement, cela nécessite la connaissance des détails de mise en œuvre spécifiques à la plate-forme.
Alternative : approche indépendante de la mise en œuvre
Pour éviter de vous fier à des connaissances spécifiques à la mise en œuvre, vous pouvez utiliser votre propre placement array nouvelle implémentation qui vérifie la surcharge au moment de l'exécution :
inline void* operator new[](std::size_t n, void* p, std::size_t limit) { if (n <= limit) std::cout << "life is good\n"; else throw std::bad_alloc(); return p; }
En faisant varier la taille du tableau et en inspectant n dans l'exemple ci-dessus, vous pouvez déduisez la valeur de y pour votre plate-forme spécifique.
Mise à jour : élimination des frais généraux
Nicol Bolas a souligné qu'à partir de novembre 2019, un rapport de défaut a résolu ce problème, en veillant à ce que y soit toujours 0 pour l'opérateur new[](std::size_t, void* p). Ce changement s'applique rétroactivement à toutes les versions de C . Par conséquent, l’estimation des frais généraux n’est plus nécessaire.
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!