Le placement New pour les tableaux peut-il garantir la portabilité ?
Bien que le placement new fournisse un moyen d'initialiser les tableaux en C, son utilisation pour les tableaux introduit un potentiel problèmes de portabilité. Plus précisément, le pointeur obtenu à partir de new[] peut s'écarter de l'adresse fournie, ce qui gêne l'allocation de tampon pour le tableau.
La norme 5.3.4, note 12, reconnaît cette divergence, ce qui rend difficile l'allocation d'un tampon de la taille appropriée pour le tableau. Un exemple met en évidence le problème :
int main() { const int NUMELEMENTS = 20; char *pBuffer = new char[NUMELEMENTS * sizeof(A)]; A *pA = new(pBuffer) A[NUMELEMENTS]; // With Visual Studio, pA will be four bytes higher than pBuffer printf("Buffer address: %x, Array address: %x\n", pBuffer, pA); }
Dans cet exemple, le compilateur semble stocker un nombre d'éléments de tableau dans les quatre premiers octets du tampon. En conséquence, une corruption de la mémoire se produit car le tampon est alloué avec seulement sizeof(A) * NUMELEMENTS octets d'espace.
Éviter les problèmes de portabilité :
Pour atténuer ces problèmes de portabilité problèmes, envisagez l'approche suivante :
int main() { const int NUMELEMENTS = 20; char *pBuffer = new char[NUMELEMENTS * sizeof(A)]; A *pA = (A*)pBuffer; for (int i = 0; i < NUMELEMENTS; ++i) { pA[i] = new (pA + i) A(); } printf("Buffer address: %x, Array address: %x\n", pBuffer, pA); }
Il est important de noter que la surcharge supplémentaire pour le placement new[] peut varier en fonction de l'implémentation et de la définition de la classe. Néanmoins, cette approche manuelle garantit la portabilité entre différents compilateurs et élimine le besoin de vérifier dynamiquement la surcharge.
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!