Fallgropar och livslängder
Undvik hängande vyer
Fallgropar och livslängder är en gratis lektion i C++ Academy på CoddyKit. Detta är lektion 3 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för C++ Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C++ Academy innehåller totalt 4 lektioner.
Vyer äger inte data
En string_view pekar endast på tecken som ägs någon annanstans. Om lagringen försvinner blir vyn hängande; åtkomst till den ger odefinierat beteende.
Hängande vy från ett tillfälligt objekt
Det är riskabelt att binda en vy till en tillfällig std::string: det tillfälliga objektet förstörs i slutet av satsen, så att vyn pekar på frigjort minne.
#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;
}Returnera inte en vy till en lokal variabel
Returnera aldrig en vy som pekar in i en lokal sträng; den lokala strängen förstörs när funktionen returnerar.
#include <string>
#include <string_view>
std::string_view bad() {
std::string local = "oops";
return local; // local dies, view dangles
}
int main() { (void)bad(); }Säkert: vy av en sträng som lever
En vy är säker så länge källan lever längre än vyn. Här lever strängen under hela funktionen.
#include <iostream>
#include <string>
#include <string_view>
int main() {
std::string s = "alive";
std::string_view sv = s;
std::cout << sv << "\n"; // safe
}Inte nullterminerad
En vyes data garanteras inte sluta med \0. Om sv.data() skickas till en C-funktion som förväntar sig en C-sträng kan funktionen läsa förbi slutet.
Använd size(), inte strlen
Använd alltid sv.size() för längden i stället för C-strängfunktioner, eftersom en vy kan vara ett utsnitt av en större buffert.
#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
}Ändra källan
Om den underliggande strängen allokeras om (till exempel när push_back ökar dess kapacitet) blir befintliga vyer in i den ogiltiga.
Lagra vyer som medlemmar
Var försiktig med att lagra en string_view som klassmedlem; ni måste garantera att den refererade datan lever längre än objektet. Lagra en std::string i stället om ni är osäkra.
Parametrar är vanligtvis säkra
Att använda string_view som en funktionsparameter är det säkra och idiomatiska fallet: argumentet lever längre än anropet.
#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";
}Kopiera när data måste bevaras
Om ni behöver behålla text längre än källans livstid kopierar ni den till en std::string. Kopieringen är priset för ägande.
#include <string>
#include <string_view>
std::string keep(std::string_view sv) {
return std::string(sv); // owns a copy
}
int main() { (void)keep("persist"); }Tumregel
Föredra string_view för parametrar och kortlivade lokala variabler. Undvik den som returtyp eller långlivad medlem om det inte tydligt framgår att datan lever längre.
Snabbtest
Kontrollera er förståelse av vyers livstider.
Sammanfattning
Ni har lärt er om vyer: fallgropar och livstider:
- Vyer äger inte data; källan måste leva längre än vyn.
- Undvik vyer till tillfälliga objekt och lokala variabler.
- Vyer garanteras inte vara nullterminerade; använd
size(). - Kopiera till en
std::stringnär texten måste bevaras.
Lär dig C++ med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 51
- Lektioner
- 203
Vanliga frågor
Är lektionen ”Fallgropar och livslängder” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen C++ Academy, inklusive ”Fallgropar och livslängder”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i C++ Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Fallgropar och livslängder”?
Undvik hängande vyer Ni övar på C++ Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig C++ Academy?
Du behöver inga förkunskaper. Utbildningen i C++ Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.
Hur lång tid tar lektionen ”Fallgropar och livslängder”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här C++ Academy-lektionen?
Ja. Varje C++ Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Varför string_view
- Skapa vyer
- Fallgropar och livslängder
- Strängalgoritmer