Le retour d'une variable de référence C est-il mauvais ?
La pratique consistant à renvoyer une référence en C peut être préoccupante, en particulier lorsqu'il s'agit de stack- variables allouées ou objets créés dynamiquement. Le renvoi de références pendantes peut entraîner des fuites de mémoire et un comportement indéfini.
Les dangers du renvoi de variables de pile
Considérez cet exemple :
int& getInt() { int i; return i; // Don't do this! }
Dans cet extrait, nous renvoyons une référence à une variable allouée par la pile. Une fois la fonction terminée, cette variable sera détruite, laissant à l'appelant une référence à une mémoire invalide. Il s'agit d'une recette infaillible pour la corruption de la mémoire et la perte de données.
Renvoi d'objets alloués dynamiquement
Bien que renvoyer une référence à un objet alloué dynamiquement puisse sembler sûr, cela peut également être délicat. Par exemple :
int& getInt() { int* i = new int; return *i; // Don't do this either! }
Maintenant, l'appelant a une référence à l'entier alloué, mais lorsqu'il tente de le supprimer, il doit utiliser l'adresse de la référence :
int& myInt = getInt(); // Note the &, we cannot lose this reference! delete &myInt; // Must delete...very strange and evil int oops = getInt(); delete &oops; // Undefined behavior, we're wrongly deleting a copy
Cela peut entraîner des erreurs d'exécution et un comportement indéfini si l'adresse d'origine est accidentellement perdue.
Returning Smart Pointeurs
Pour éviter ces pièges potentiels, pensez à utiliser des pointeurs ou conteneurs intelligents, qui gèrent automatiquement la durée de vie des objets. Par exemple :
std::unique_ptr<int> getInt() { return std::make_unique<int>(0); }
Avec les pointeurs intelligents, l'appelant s'approprie automatiquement la mémoire allouée, garantissant ainsi un nettoyage approprié des ressources.
Quand le renvoi des références est sécurisé
Il existe des cas où le renvoi de références est approprié, comme le renvoi de références aux membres de la classe lorsque la durée de vie de l'objet est garantie comme étant plus longue que l'appel. De plus, renvoyer une référence à une valeur calculée peut être efficace et intuitif.
Résumé
Renvoyer des références en C peut être pratique, mais cela doit être fait avec prudence. Évitez de renvoyer des références à des variables de courte durée ou à des objets alloués dynamiquement sans une gestion appropriée des ressources. En cas de doute, envisagez d’utiliser des pointeurs intelligents ou une sémantique de valeur. Si la durée de vie d'un objet est explicitement gérée à un niveau supérieur, il est généralement sûr de renvoyer des références à ses membres.
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!