Question

Deux questions 1) Que se passe-t-il lorsqu'un objet / variable est jeté pour attraper? Dites par exemple,

int foo() {
   FILE *fp = ....;
   int dummy = 10;
   int *dummy_ptr = new int[10];
   throw 1;
}

int main() {
 try {
   foo();
 } catch (int &i) { 
   std::cout<<"ERROR, the value is "<<i<<std::endl;
 }
}

Dans cette situation, que se passe-t-il ici? Une nouvelle variable créée puis passée ???

Et si j'utilise un pointeur ou une variable sans référence

comme catch (int * i) // ou catch (int i)

De plus, toutes les variables / ressources déclarées ou initiées à l'intérieur de la portée ont-elles été libérées / fermées?

2) Aussi dans le cas de Rethrow, si je prévois de remédier avec une référence, la deuxième prise obtient une nouvelle variable, si je relance avec sans référence (c'est-à-dire par valeur, alors les modifications effectuées dans le lancer intermédiaire ne sont pas affectées ....

int goo() {
    throw 2;
}

int foo() {
   try{
      goo();
   } catch(int &i) { // (or) catch(int i) // i is not changing in the next line.
      i = 2;
      throw;
   }
}

int main() {
 try {
   foo();
 } catch (int &i) { 
   std::cout<<"ERROR, the value is "<<i<<std::endl;
 }
}

Sortie: catch (int & i) // imprime 2 catch (int i) // imprime 1

De mon jugement,

Ce que je pense est que, tant qu'il s'agit de référence, la valeur est affectée, si sa «valeur passe» à l'étape intermédiaire. Il lance toujours l'objet d'origine à la deuxième prise.

(c'est-à-dire) Le flux de contrôle pour la variable n'est vraiment pas de lancer la prise intermédiaire .....

Était-ce utile?

La solution

Oui, lorsqu'une exception est lancée, toutes les variables automatiques sont détruites, dans le cadre du lancer et toutes les lunettes qui entourent jusqu'à ce que le gestionnaire soit atteint.

Une note à ce sujet, votre mémoire dans dummy_ptr* ne sera pas traité, et votre FILE aiguille fp* ne sera pas fermé.

Autres conseils

Dans cette situation, que se passe-t-il ici? Une nouvelle variable créée puis passée?

Oui; Lorsque vous lancez un objet, il est créé quelque part, puis détruit une fois l'exception gérée (c'est-à-dire après avoir quitté le catch bloc sans repenser).

Et si j'utilise un pointeur ou une variable sans référence? Aussi dans le cas de Rethrow ...

Si vous attrapez par valeur, vous obtiendrez une copie de cet objet - si vous repelez l'exception, le gestionnaire suivant obtiendra une nouvelle copie de l'original et ne verra aucune modification que vous auriez pu apporter. Catching par référence vous donnera une référence à l'objet lancé - si vous reménagez, alors le gestionnaire suivant sera Voir toutes les modifications que vous avez apportées. Vous ne pouvez pas attraper l'objet par pointeur - vous n'attrapez un pointeur que si un pointeur a été lancé.

De plus, toutes les variables déclarées ou initiées à l'intérieur de la portée ont-elles été fermées?

Lorsqu'une exception est jetée, toutes les variables automatiques sont détruites, dans la portée du throw et toutes les lunettes qui entourent jusqu'à ce que le gestionnaire soit atteint. Variables allouées dynamiquement (comme votre new int[10]) sommes ne pas des fonctions de nettoyage supprimées et arbitraires comme fclose ne sont certainement pas appelés FILE* Variables, sauf si elles sont gérées par un objet basé sur la portée telle qu'un pointeur intelligent.

Je ne pense pas que vous puissiez appeler cela une variable; il n'a pas de nom. Mais un nouvel objet de type int est créé, dans un lieu non spécifié déterminé par l'implémentation. Lorsque vous attrapez par référence, la référence est liée à cet objet caché. Et lorsque vous tombez de l'extrémité du bloc de capture ou que vous laissez le bloc de capture par tous les moyens autres que de repenser la même exception, l'objet est «libéré».

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top