Gestion appropriée de la mémoire pour le placement nouveau
Lors de l'utilisation du placement nouveau, il incombe au programmeur d'invoquer manuellement le destructeur et de libérer la mémoire allouée . Cela diffère du comportement par défaut de l'opérateur de suppression, qui gère généralement les deux tâches.
Pourquoi ne pas supprimer ?
Dans le code fourni :
char* pMemory = new char[sizeof(MyClass)]; MyClass* pMyClass = new(pMemory) MyClass();
La mémoire est allouée manuellement à l'aide de new[] pour un tableau de caractères de taille correspondant à l'objet MyClass. Le placement new est ensuite utilisé pour construire l'objet dans cette mémoire.
Utiliser delete ici serait incorrect car l'opérateur new[] a été utilisé pour allouer la mémoire manuellement. delete est destiné à la mémoire allouée à l'aide de l'opérateur new, ce qui n'est pas le cas ici.
Responsabilité du destructeur
Depuis que le placement new a été utilisé, il est de la responsabilité du programmeur d'appeler le destructeur pour libérer l'objet. Cependant, cela ne libère pas automatiquement la mémoire allouée. Pour éviter une fuite de mémoire, la mémoire doit être libérée explicitement après l'appel du destructeur.
Placement nouveau avec des tampons internes
Le nouveau placement peut également être utilisé avec des tampons internes qui n'ont pas été attribués avec l'opérateur nouveau. Dans de tels cas, l'opérateur delete ne doit pas être appelé car cela pourrait entraîner un comportement inattendu ou une corruption de la mémoire.
Par exemple :
struct buffer_struct { std::aligned_storage_t<sizeof(MyClass), alignof(MyClass)> buffer; }; MyClass* pMyClass = new (&a.buffer) MyClass(); //created inside buffer_struct a
Dans ce cas, buffer_struct fournit le stockage pour le Objet MyClass, mais la construction et la destruction de l'objet sont gérées indépendamment en utilisant respectivement le placement new et le destructeur.
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!