java - 是否类 类型指针、引用作为形参 ,函数结束不会自动析构类?
PHP中文网
PHP中文网 2017-04-18 10:51:17
0
3
808

自动析构是在作用域结束时析构作用域里创建的类对象的吗?

PHP中文网
PHP中文网

认证0级讲师

répondre à tous(3)
左手右手慢动作

Si l'objet est obtenu à l'aide d'un pointeur new, il doit être manuellement delete Le destructeur ne le détruira pas automatiquement pour vous, comme std::string* s = new std::string; S'il s'agit d'une chaîne construite dans une classe, this. la classe s sera recyclée, mais l'espace pointé par s ne sera pas recyclé. Vous devez seulement vous rappeler que la référence est en fait un alias et vous pouvez faire votre propre jugement

.
阿神

Je n’aurais pas dû en dire autant et je n’ai pas bien compris.

A la fin de la fonction, seules les variables automatiques déclarées dans le corps de la fonction et les paramètres formels de la fonction seront détruits (détruits), et les objets auxquels elles font référence (le cas échéant) ne seront pas détruits avec leur destruction . L'objet référencé par un pointeur/référence a sa propre période de stockage indépendante. Le moment où cet objet est détruit dépend de sa propre période de stockage.

Ce que vous avez demandé dans votre question, c'est quand le destructeur est implicitement appelé. L'appel implicite au destructeur dépend également de la durée de stockage de l'objet. En termes simples, si un objet est construit, son destructeur sera appelé lorsqu'il sera détruit.

12.3.2.11 Les destructeurs sont invoqués implicitement
— pour les objets construits avec une durée de stockage statique (3.7.1) à la fin du programme (3.6.3),
— pour les objets construits avec une durée de stockage des threads ( 3.7.2) à la sortie du thread,
— pour les objets construits avec une durée de stockage automatique (3.7.3) lorsque le bloc dans lequel un objet est créé sort (6.7),
— pour les objets temporaires construits lorsque la durée de vie de un objet temporaire se termine (12.2),
— pour les objets construits alloués par une nouvelle expression (5.3.4), grâce à l'utilisation d'une expression de suppression (5.3.5),
— dans plusieurs situations en raison de la gestion des exceptions (15.3).


À propos de la citation :

La référence n'est pas un objet, mais elle a également une période de stockage (la période de stockage s'applique à n'importe quelle variable). Les règles de destruction pour les durées de conservation s'appliquent également aux références.
Mais je n'ai pas trouvé de description précise de ce qui se passe lorsque la référence est détruite. La manière exacte dont les références sont détruites doit dépendre de l’implémentation du compilateur. La situation générale devrait être la suivante : si la référence occupe de l'espace de stockage lors de la mise en œuvre, l'espace sera récupéré. Sans possession, rien ne se passe. (Les paramètres formels des types référence occupent souvent de l'espace de stockage lorsque la fonction n'est pas intégrée)

3.7.3 Les catégories de durée de stockage s'appliquent également aux références. La durée de vie d'une référence est sa durée de stockage.

8.3.2.4 Il n'est pas précisé si une référence nécessite ou non un stockage.

3.9.8 Un type d'objet est un type (éventuellement qualifié par cv) qui n'est pas un type de fonction, ni un type de référence, ni un type vide.

1.8 [...] Un objet est une région de stockage. [ Remarque : une fonction n'est pas un objet, qu'elle occupe ou non le stockage comme le font les objets — note de fin ] [... ]

刘奇

1. Le destructeur est introduit par C++ pour les classes. C'est une fonction qui est appelée après la fin du cycle de vie de la variable de classe et avant que l'espace ne soit recyclé.
2. Les pointeurs de classe et les références de classe (pointeurs constants pointant vers des variables) ne sont que des types de données de base (pointeurs). Leur espace de pile correspondant sera recyclé une fois l'appel de fonction terminé.
3. Si le paramètre passé est un objet de classe, comme mentionné dans le premier point, le destructeur sera appelé avant que l'espace ne soit recyclé.
4. Toutes les variables de classe sur la pile seront automatiquement détruites après la fin du cycle de vie, mais les variables de classe sur le tas (allouées par des opérations telles que new) ne le seront pas et devront être libérées manuellement pour déclencher l'appel du destructeur. .

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal