Le placement nouveau fournit un moyen d'allouer de la mémoire aux objets à un emplacement de mémoire spécifique. Bien que son utilisation avec des baies semble simple, parvenir à la portabilité peut présenter des défis.
Le problème
Considérons l'exemple suivant :
char *pBuffer = new char[NUMELEMENTS*sizeof(A)]; A *pA = new(pBuffer) A[NUMELEMENTS];
Ici, pBuffer contient un tampon pour le tableau alloué par new[]. Cependant, new(pBuffer) A[NUMELEMENTS] peut ne pas renvoyer la même adresse que pBuffer, ce qui pourrait entraîner une corruption de la mémoire.
Résoudre le problème
Une approche consiste à placez manuellement chaque élément du tableau individuellement en utilisant placement new :
for(int i = 0; i < NUMELEMENTS; ++i) { pA[i] = new (pA + i) A(); }
Cela garantit que chaque élément est alloué au bon emplacement dans le tampon.
Gestion des destructeurs
Lors de la suppression du tableau, il est essentiel d'invoquer manuellement les destructeurs de chaque élément avant de supprimer le tampon :
for(int i = 0; i < NUMELEMENTS; ++i) { pA[i].~A(); } delete[] pBuffer;
Cette approche garantit un nettoyage correct des objets et une désallocation de mémoire.
Conclusion
Le nouveau placement des baies pose des problèmes de portabilité en raison d'un désalignement potentiel entre les adresses allouées et renvoyées. En plaçant manuellement chaque élément du tableau et en gérant les destructeurs, les développeurs peuvent surmonter ces défis et tirer parti du placement de nouveaux éléments en toute sécurité dans du code portable.
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!