La spécification C 11 indique que toutes les nouvelles expressions de tableau peuvent entraîner une surcharge non spécifiée, y compris celles qui font référence à la fonction de bibliothèque opérateur new[](std::size_t, void*) et autres fonctions d'allocation de placement. Cette surcharge peut varier à chaque invocation de new.
Considérons l'exemple :
void* buffer = malloc(sizeof(std::string) * 10); std::string* p = ::new (buffer) std::string[10];
Selon la spécification, new (buffer) std::string[10] invoquera l'opérateur new[ ](sizeof(std::string) * 10 y, buffer), où y est une valeur de surcharge non négative non spécifiée. Si vous > 0, le tampon pré-alloué sera insuffisant.
Il n'est pas possible de déterminer avec précision la valeur de surcharge y à partir de la norme. Par conséquent, il n'est pas recommandé d'utiliser l'opérateur new[](std::size_t, void* p) sauf si vous avez des connaissances spécifiques sur l'implémentation de la plateforme.
Si vous devez utiliser array placement-new avec un pré -tampon alloué, vous pouvez créer votre propre nouvelle fonction de tableau de placement pour vérifier dynamiquement la surcharge :
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; } int main() { alignas(std::string) char buffer[100]; std::string* p = new(buffer, sizeof(buffer)) std::string[3]; }
En faisant varier la taille du tableau et en inspectant la valeur n, vous pouvez déduire le y frais généraux pour votre plateforme.
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!