Maison > développement back-end > C++ > Comment les objets sont-ils détruits en C ?

Comment les objets sont-ils détruits en C ?

Barbara Streisand
Libérer: 2024-12-10 09:45:12
original
646 Les gens l'ont consulté

How Are Objects Destroyed in C  ?

Destruction d'objets en C

Objets à portée

Objets automatiques : Détruits dans l'ordre inverse de la définition, lorsque la portée englobante conclut.
Objets statiques non locaux : Détruits dans l'ordre inverse de la définition, après l'exécution de main (variables globales, données des membres statiques).
Objets statiques locaux : Construits le premier flux de contrôle temporel passe leur définition et détruits dans l'ordre inverse après l'exécution de main (variables statiques au sein des fonctions).

Classe de base et sous-objets membres :**

Détruits dans l'ordre inverse de la définition, premiers sous-objets membres, puis les sous-objets de la classe de base.

Éléments du tableau :**

Détruits par ordre décroissant. Si une exception se produit lors de la construction du n-ième élément, les éléments n-1 à 0 sont détruits en premier.

Objets temporaires :**

Construits lorsque les expressions prvalue de type classe sont évaluées. Détruit lorsque l'expression contenant termine son évaluation. Si une exception se produit lors de l'évaluation, les objets temporaires sont correctement détruits.

Objets et tableaux dynamiques :**

Objets dynamiques : Alloués avec new Foo et détruits avec delete p .
Tableaux dynamiques : Alloué avec le nouveau Foo[n] et détruit avec delete[] p.

Dans les deux cas, tenter de détruire la mémoire plusieurs fois, y accéder après la destruction ou utiliser des mécanismes de destruction incorrects (par exemple, delete[] pour des objets uniques) entraîne un comportement indéfini. Si une exception se produit pendant la construction, la mémoire allouée dynamiquement est libérée avant que l'exception ne se propage.

Pointeurs intelligents de comptage de références :**

std::shared_ptr: Détruit l'objet géré en tant que dernier std::shared_ptr l'objet qui y fait référence est détruit.

Comportement d'exception :

Les destructeurs ne doivent jamais lancer d'exceptions car cela peut mettre fin au programme. Si une exception se produit lors de la destruction d'un objet, elle est propagée et tous les sous-objets précédemment détruits sont correctement détruits. Cependant, si une exception d'un objet dynamique se produit pendant la construction, la mémoire est libérée avant que l'exception ne se propage et le destructeur de l'objet n'est pas appelé.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal