Maison > Article > développement back-end > Voici quelques options de titre, en gardant à l’esprit le format de la question et sa pertinence par rapport au contenu : Option 1 (Concentrez-vous sur le problème) : * Pourquoi « delete buf » est-il incorrect lors de l'utilisation de Placement New ? Option 2 (
Placement Nouveau et Suppression : désallocation appropriée de la mémoire
Lors de l'allocation de mémoire avec l'opérateur "placement nouveau" (syntaxe nouvelle (mem)) et l'opérateur new standard, il est crucial d'utiliser la bonne méthode pour libérer cette mémoire.
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));</code>
Pour libérer correctement la mémoire allouée, vous devez appeler :
<code class="cpp">buf->~Buffer(); ::operator delete(mem);</code>
C'est parce que :
Approches incorrectes :
Approche 1 :
<code class="cpp">delete (char*)buf;</code>
Cette approche est incorrecte car elle tente de supprimer le tampon comme s'il s'agissait d'un pointeur char*. Cependant, la mémoire a été allouée avec le placement new, vous devez donc utiliser l'opérateur delete à la place.
Approche 2 :
<code class="cpp">delete buf;</code>
Cette approche est également incorrecte car elle échoue pour appeler manuellement le destructeur de l'objet Buffer. Par conséquent, les ressources acquises par l'objet risquent de ne pas être libérées, ce qui pourrait entraîner des fuites de mémoire ou d'autres problèmes.
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!