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 :
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!