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
Barbara Streisandoriginal
2024-10-28 12:50:02860parcourir

 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>

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>

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!

Déclaration:
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