2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Nous savons que delete est utilisé pour libérer un espace dynamique et delete[] est utilisé pour libérer plusieurs espaces dynamiques, mais quels problèmes surviendront si nous les mélangeons ? J'ai lu de nombreux articles sur le blog, mais ils ne sont pas satisfaisants, j'ai donc écrit cet article pour vous dire de quoi il s'agit et pourquoi (Une explication superficielle, corrigez-moi s'il vous plaît)。
---------------------------------------------------------------------------------------------------------------------------------
Nous pouvons d’abord regarder un exemple :
Le résultat courant est :
Mais si nous n’écrivons pas explicitement le destructeur :
Le résultat est un fonctionnement normal :
---------------------------------------------------------------------------------------------------------------------------------
pourquoi ?
Si je vous demande combien d'espace le système alloue à ces 10 objets de classe A, vous répondrez probablement 40 octets.C’est facile à comprendre. Un A fait 4 octets et 10 fait 40 octets. .Mais en fait, si vous écrivez le destructeur vous-même, un total de 44 octets sera alloué. Si vous n'écrivez pas de destructeur, un total de 40 octets sera alloué.。
Pourquoi y a-t-il 4 octets supplémentaires après l'écriture du destructeur ? Nous savons qu'après avoir utilisé delete pour libérer cet espace, le destructeur sera automatiquement appelé (http://t.csdnimg.cn/f2FOj), (1) Si nous écrivons le destructeur nous-mêmes, delete doit l'appeler (En fait, delete est aussi une fonction, ce qui équivaut à un appel imbriqué de la fonction.), alors combien de fois il est appelé est une question. Ces quatre octets ont exactement la taille d'un entier. Cet entier est utilisé pour enregistrer le nombre d'objets dans cet espace, déterminant ainsi combien de fois le constructeur et le destructeur doivent l'être. appelé.Cependant, il faut savoir que le pointeur p pointe toujours vers le premier objet, mais il ira en avant pour obtenir le nombre d'objets lors de la construction et de la destruction., la relation spécifique est la suivante :
(2) Si nous n'écrivons pas de destructeur à ce moment-là, il appellera le destructeur généré par le compilateur sans enregistrer le nombre de fois (cela peut impliquer un niveau inférieur, je n'en suis pas sûr, veuillez me corriger), et il n'est pas nécessaire d'en ouvrir une supplémentaire. Chirurgie plastique.
D'accord, nous pouvons maintenant expliquer l'exemple ci-dessus
Supprimer libère de l'espace à partir de la position pointée par le pointeur par défaut ; delete[] vérifie d'abord si plus d'espace est ouvert par défaut, et si c'est le cas, avance le pointeur d'une position avant de le libérer. Si vous ouvrez plus d'espace ou utilisez delete pour libérer l'espace, l'espace ouvert ne peut pas être libéré, provoquant une fuite de mémoire et une erreur est donc signalée.
Vais-je obtenir une erreur si je pratique cela ? :
Il n'est pas nécessaire d'appeler le destructeur, il n'est pas nécessaire de compter le nombre d'objets et il n'est pas nécessaire d'ouvrir plus d'espace. Par conséquent, l'espace peut être libéré de la position pointée par le pointeur, donc aucune erreur ne se produira. signalé.
Il existe de nombreuses situations, vous pouvez descendre et essayer vous-même.