Maison > développement back-end > C++ > Le placement New sur les tableaux garantit-il la portabilité en C ?

Le placement New sur les tableaux garantit-il la portabilité en C ?

Patricia Arquette
Libérer: 2024-11-12 16:48:02
original
462 Les gens l'ont consulté

Does Placement New on Arrays Guarantee Portability in C  ?

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);
}
Copier après la connexion

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 :

  • Placement manuel nouveau : Plutôt que d'utiliser placement nouveau sur le tableau, utilisez-le pour initialiser chaque élément du tableau individuellement. Par exemple :
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);
}
Copier après la connexion
  • Destruction manuelle : Détruisez manuellement chaque élément du tableau avant de supprimer le tampon pour éviter les fuites de mémoire.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal