Durée de vie des références et références pendantes
Éviter les références pendantes en raisonnant soigneusement sur la durée de vie des objets
Durée de vie des références et références pendantes est une leçon C++ Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C++ Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C++ Academy comprend 4 leçons au total.
Qu’est-ce qu’une référence pendante
Une référence devient pendante lorsque l’objet auquel elle fait référence a été détruit. L’utiliser constitue un comportement indéfini : tout peut arriver.
L’exemple classique
Renvoyer une référence vers une variable locale. La variable locale disparaît lorsque la fonction renvoie son résultat ; l’appelant conserve une référence vers une mémoire qui n’est plus valide.
// BUG
int& bad() {
int x = 10;
return x; // x dies here
}
int& r = bad();
std::cout << r; // UBRéférences vers les éléments d’un conteneur
Une référence vers un élément d’un std::vector devient pendante si le tableau dynamique est réalloué. L’ajout d’éléments peut déplacer toute la zone de stockage.
std::vector<int> v = {1, 2, 3};
int& r = v[0];
v.push_back(99); // may reallocate
std::cout << r; // possibly UBRéférences vers les éléments des maps et des listes
Certains conteneurs (std::list, std::map, std::unordered_map pour les nœuds non concernés) fournissent des itérateurs et des références stables. std::vector et std::deque ne le font pas.
Règles de durée de vie des temporaires
Une référence constante prolonge la durée de vie d’un temporaire, mais une fonction qui renvoie cette référence ne la prolonge pas davantage.
// Subtle BUG
const std::string& f() {
return std::string("temp"); // dies at return
}
const std::string& s = f(); // danglingDurée de vie dans les instructions d’initialisation de if (C++17)
Les variables des instructions d’initialisation de if/switch en C++17 restent en vie pendant le corps de if/switch, ce qui est utile, mais soyez attentif à la portée.
if (const auto& it = map.find(k); it != map.end()) {
use(it->second);
}
// `it` is dead hereMembres de référence dans les classes
Stocker une référence comme membre d’une classe lie la durée de vie de la classe à celle de l’objet référencé. La classe ne peut jamais survivre à cet objet. Utilisez cette approche uniquement lorsque la sémantique de propriété l’exige.
Pointeur ou référence pour une propriété facultative
Une référence ne peut pas être nulle, mais si l’objet référencé disparaît, la référence est rompue. Les pointeurs permettent de représenter plus explicitement les cas facultatifs ou potentiellement pendants.
Préférez les pointeurs intelligents
Pour une propriété partagée, utilisez std::shared_ptr. Le pointer maintient l’objet en vie tant qu’au moins un shared_ptr existe. Ce sujet est traité dans le cours sur les pointeurs intelligents.
Aide du compilateur : lifetimebound
Les compilateurs modernes (Clang, GCC) émettent des avertissements pour certains modèles de références pendantes. Activez -Wdangling-reference lorsque cette option est disponible.
Idiome courant : types de vues
std::string_view et std::span sont des vues ne possédant pas les objets référencés. Elles présentent les mêmes problèmes de durée de vie que les références et exigent les mêmes précautions.
Vérification rapide
Quelle opération peut invalider les références vers les éléments d’un std::vector ?
Récapitulatif
Les références ne prolongent ni ne possèdent rien : elles sont des alias vers un objet existant. Elles deviennent pendantes si l’objet disparaît en premier. Méfiez-vous des références vers des variables locales renvoyées par les fonctions, de la réallocation des conteneurs et des temporaires qui persistent.
Apprends C++ avec un tuteur IA — gratuit
Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.
- Cours
- 51
- Leçons
- 203
Questions Fréquemment Posées
La leçon « Durée de vie des références et références pendantes » est-elle gratuite ?
Oui — le texte complet de « Durée de vie des références et références pendantes » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C++ Academy, passe à CoddyKit PRO. Le cours C++ Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Durée de vie des références et références pendantes » ?
Éviter les références pendantes en raisonnant soigneusement sur la durée de vie des objets Tu pratiques C++ Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer C++ Academy ?
Aucune expérience préalable n'est requise. C++ Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.
Combien de temps prend la leçon « Durée de vie des références et références pendantes » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon C++ Academy ?
Oui. Chaque leçon C++ Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Pourquoi les références sont des alias de variables
- Passage par valeur ou par référence
- Références const et situations appropriées
- Durée de vie des références et références pendantes