Maison  >  Article  >  développement back-end  >  Nouveau placement : pourquoi ne pouvons-nous pas utiliser « supprimer » pour libérer de la mémoire ?

Nouveau placement : pourquoi ne pouvons-nous pas utiliser « supprimer » pour libérer de la mémoire ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-26 13:50:02367parcourir

 Placement New: Why Can't We Use `delete` to Deallocate Memory?

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!

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