Pièges et durées de vie
Éviter les vues pendantes
Pièges et durées de vie est une leçon C++ Academy gratuite sur CoddyKit. Ceci est la leçon 3 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.
Les vues ne possèdent pas les données
Une string_view pointe uniquement vers des caractères possédés ailleurs. Si cette zone de stockage disparaît, la vue devient pendante et son accès entraîne un comportement indéfini.
Vue pendante issue d'un temporaire
Lier une vue à un std::string temporaire est dangereux : le temporaire est détruit à la fin de l'instruction, laissant la vue pointer vers une mémoire libérée.
#include <string>
#include <string_view>
std::string make() { return "temp"; }
int main() {
std::string_view sv = make(); // dangles immediately
// using sv here is undefined behavior
(void)sv;
}Renvoyer une vue vers une variable locale
Ne renvoyez jamais une vue qui pointe dans une chaîne locale ; la variable locale est détruite lorsque la fonction renvoie son résultat.
#include <string>
#include <string_view>
std::string_view bad() {
std::string local = "oops";
return local; // local dies, view dangles
}
int main() { (void)bad(); }Sûr : vue d'une chaîne encore vivante
Une vue est sûre tant que sa source existe plus longtemps qu'elle. Ici, la chaîne reste présente pendant toute la durée de la fonction.
#include <iostream>
#include <string>
#include <string_view>
int main() {
std::string s = "alive";
std::string_view sv = s;
std::cout << sv << "\n"; // safe
}Pas terminée par un caractère nul
Les données d'une vue ne sont pas garanties de se terminer par un \0. Passer sv.data() à une fonction C qui attend une chaîne C peut entraîner une lecture au-delà de la fin.
Utiliser size(), pas strlen
Fiez-vous toujours à sv.size() pour obtenir la longueur plutôt qu'aux fonctions des chaînes C, car une vue peut être une tranche d'un tampon plus grand.
#include <iostream>
#include <string_view>
int main() {
std::string_view sv = std::string_view("hello world").substr(0, 5);
std::cout << sv.size() << "\n"; // 5, not 11
}Modifier la source
Si la chaîne sous-jacente est réallouée, par exemple lorsque push_back augmente sa capacité, les vues existantes qui pointent vers elle deviennent invalides.
Stocker des vues dans des membres
Soyez prudent lorsque vous stockez une string_view comme membre d'une classe ; vous devez garantir que les données référencées existent plus longtemps que l'objet. En cas de doute, stockez plutôt un std::string.
Les paramètres sont généralement sûrs
Utiliser string_view comme paramètre de fonction est le cas sûr et idiomatique : l'argument existe plus longtemps que l'appel.
#include <iostream>
#include <string_view>
size_t len(std::string_view sv) { return sv.size(); }
int main() {
std::cout << len("temporary is fine here") << "\n";
}Copier lorsque la conservation est nécessaire
Si vous devez conserver du texte au-delà de la durée de vie de sa source, copiez-le dans un std::string. La copie est le prix à payer pour en devenir propriétaire.
#include <string>
#include <string_view>
std::string keep(std::string_view sv) {
return std::string(sv); // owns a copy
}
int main() { (void)keep("persist"); }Règle générale
Préférez string_view pour les paramètres et les variables locales à courte durée de vie. Évitez-la comme type de retour ou comme membre à longue durée de vie, sauf si les données ont clairement une durée de vie plus longue.
Vérification rapide
Vérifiez votre compréhension des durées de vie des vues.
Récapitulatif
Vous avez appris les pièges des vues et les durées de vie :
- Les vues ne possèdent pas les données ; la source doit exister plus longtemps que la vue.
- Évitez les vues vers des temporaires et des variables locales.
- Les vues ne sont pas garanties d'être terminées par un caractère nul ; utilisez
size(). - Copiez dans un
std::stringlorsque vous devez conserver le texte.
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 « Pièges et durées de vie » est-elle gratuite ?
Oui — le texte complet de « Pièges et durées de vie » 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 « Pièges et durées de vie » ?
Éviter les vues pendantes 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 3 sur 4.
Combien de temps prend la leçon « Pièges et durées de vie » ?
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 utiliser string_view
- Créer des vues
- Pièges et durées de vie
- Algorithmes sur les chaînes