Placement nouveau pour les baies : un guide d'utilisation portable
Bien que le placement nouveau offre un outil puissant pour l'allocation de baies, garantissant sa portabilité un défi. Comme observé dans l'exemple fourni, Visual Studio peut allouer des tampons qui diffèrent de l'adresse transmise à new[], ce qui peut entraîner une corruption de la mémoire.
Comprendre la surcharge
La surcharge impliquée dans l’utilisation du placement new sur les tableaux dépend du compilateur. Dans Visual Studio, le compilateur ajoute un nombre de quatre octets au tampon pour suivre le nombre d'éléments dans le tableau. Ce nombre est crucial pour appeler des destructeurs d'objets lorsque le tableau est supprimé.
Alternatives portables
Pour résoudre le problème de portabilité, envisagez les alternatives suivantes :
Placement séparé nouveau pour chaque élément :
Au lieu d'utiliser le nouveau placement pour l'ensemble tableau, allouez chaque élément individuellement :
char *pBuffer = new char[NUMELEMENTS * sizeof(A)]; A *pA = (A*)pBuffer; for (int i = 0; i < NUMELEMENTS; ++i) { pA[i] = new (pA + i) A(); }
Cette approche élimine le besoin de surcharge supplémentaire et garantit la portabilité.
Destruction manuelle d'objets :
Quelle que soit la méthode d'allocation, assurez-vous que chaque objet du tableau est détruit manuellement avant de supprimer le buffer :
for (int i = 0; i < NUMELEMENTS; ++i) { pA[i].~A(); }
Cette étape évite les fuites de mémoire et garantit un nettoyage correct des objets.
Surcharge de suivi de la mémoire
Il est important de noter que le compilateur la surcharge pour le suivi de la mémoire varie. Par exemple, dans Visual Studio, la suppression du destructeur virtuel de la classe élimine le besoin de compter quatre octets. Comprendre les exigences de suivi de la mémoire de votre compilateur spécifique peut vous aider à optimiser les performances.
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!