Maison > développement back-end > C++ > Lors de l'utilisation de Placement New, « supprimer » est-il réellement désalloué correctement ?

Lors de l'utilisation de Placement New, « supprimer » est-il réellement désalloué correctement ?

Barbara Streisand
Libérer: 2024-10-28 12:50:02
original
833 Les gens l'ont consulté

 When Using Placement New, Does `delete` Actually Deallocate Correctly?

Placement Nouveau et Supprimer

En C , la surcharge d'opérateurs permet l'utilisation d'opérateurs de création et de suppression personnalisés. Cependant, cela soulève la question de savoir comment libérer correctement la mémoire allouée avec de tels opérateurs. Considérez l'extrait de code suivant :

<code class="cpp">const char* charString = "Hello, World";
void *mem = ::operator new(sizeof(Buffer) + strlen(charString) + 1);
Buffer* buf = new(mem) Buffer(strlen(charString));

delete (char*)buf; // OR delete buf;</code>
Copier après la connexion

Déléguer la tâche de désallocation de mémoire à l'opérateur de suppression surchargé (méthode directe) semble logique. Cependant, cette approche est incorrecte.

Méthode correcte

La manière correcte de désallouer la mémoire dans ce cas consiste à appeler explicitement le destructeur de l'objet, suivi de l'opérateur fonction delete pour libérer la mémoire allouée :

<code class="cpp">buf->~Buffer();
::operator delete(mem);</code>
Copier après la connexion

Explication

Lors de l'utilisation de l'opérateur placement new, qui prend une adresse mémoire pré-allouée, le constructeur par défaut est pas appelé automatiquement. Il est donc crucial d’appeler manuellement le destructeur. Alternativement, appeler directement delete buf est également incorrect car il appelle uniquement l'opérateur global delete, qui ne connaît pas la nouvelle allocation de placement.

Quand utiliser Buf->~Buffer()

L'appel du destructeur (buf->~Buffer()) est requis chaque fois que l'opérateur de placement new est utilisé, même lorsque la fonction de suppression ::operator est appelée ultérieurement.

Bonne pratique

Pour éviter toute confusion, utilisez toujours une paire d'opérateurs correspondants, tels que :

  • ::operator new et ::operator delete
  • new() et delete() (placement new/delete)

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