Hvorfor smartpekere erstatter rå new og delete
Forstå RAII, og hvorfor eierskap med råpekere sjelden er riktig i moderne C++.
Hvorfor smartpekere erstatter rå new og delete er en gratis leksjon i C++ Academy på CoddyKit. Dette er leksjon 1 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i C++ Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i C++ Academy inneholder totalt 4 leksjoner.
Rå new og delete
Arven fra C: new T allokerer en T på heapen, mens delete frigjør den. Hver new må kobles til nøyaktig én delete – ellers oppstår det en minnelekkasje eller et krasj.
Widget* w = new Widget();
// ... use w ...
delete w; // forget this and you leakHva som går galt
Vanlige feil:
- Glemt
delete– minnelekkasje - Dobbel
delete– udefinert oppførsel - Unntak mellom
newogdelete– minnelekkasje - Retur av en rå peker med uklart eierskap
RAII til unnsetning
Resource Acquisition Is Initialization: Knytt levetiden til en ressurs til levetiden til et objekt på stacken. Destruktøren frigjør ressursen – selv om det oppstår et unntak.
Ideen bak smarte pekere
En smart peker er en liten RAII-innpakning rundt en rå peker. Destruktøren kaller delete. De glemmer aldri å frigjøre minne.
De tre smarte pekerne
Smarte pekere i standardbiblioteket i <memory>:
std::unique_ptr<T>– eksklusivt eierskapstd::shared_ptr<T>– delt eierskap med referansetellingstd::weak_ptr<T>– en ikke-eiende observatør av en shared_ptr
Smarte pekere er rimelige
unique_ptr har ingen ekstra kostnad (samme størrelse og hastighet som en rå peker). shared_ptr har en liten kostnad for atomisk referansetelling.
Slutt på manuell delete
Med smarte pekere skriver De nesten aldri delete. Destruktøren tar seg av det.
#include <memory>
std::unique_ptr<Widget> w = std::make_unique<Widget>();
// no delete needed — when w goes out of scope, Widget is destroyedSmarte pekere og unntak
Hvis det oppstår et unntak midt i en funksjon, destrueres lokale variabler i omvendt rekkefølge. Smarte pekere frigjør ressursene sine automatisk – rå pekere lekker.
Eierskap i typen
Den smarte pekerens type inneholder nå informasjon om eierskapet. Ved å lese en funksjonssignatur ser De hvem som eier objektet.
// I take ownership
void consume(std::unique_ptr<Widget> w);
// I look but do not own
void inspect(const Widget& w);Rå pekere finnes fortsatt
Bruk rå pekere eller referanser for ikke-eiende tilgang. De kommuniserer «jeg låner, jeg eier ikke».
Erstatt new med make-funksjoner
Foretrekk std::make_unique (C++14) og std::make_shared (C++11). De er unntakssikre og litt mer effektive enn å kalle new direkte.
auto w = std::make_unique<Widget>(42);
auto s = std::make_shared<Resource>("file.txt");Kort kontrollspørsmål
Hva er hovedgrunnen til å bruke std::unique_ptr i stedet for et rått new/delete-par?
Oppsummering
Rå new/delete er utsatt for feil. Smarte pekere pakker heap-allokerte objekter inn i RAII-håndtak som frigjør dem automatisk. Foretrekk std::make_unique og std::make_shared for sikkerhet og ytelse.
Lær deg C++ med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 51
- Leksjoner
- 203
Ofte stilte spørsmål
Er leksjonen «Hvorfor smartpekere erstatter rå new og delete» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien C++ Academy, inkludert «Hvorfor smartpekere erstatter rå new og delete», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i C++ Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Hvorfor smartpekere erstatter rå new og delete»?
Forstå RAII, og hvorfor eierskap med råpekere sjelden er riktig i moderne C++. Du øver på C++ Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med C++ Academy?
Ingen tidligere erfaring er nødvendig. C++ Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.
Hvor lang tid tar leksjonen «Hvorfor smartpekere erstatter rå new og delete»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne C++ Academy-leksjonen?
Ja. Alle C++ Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Hvorfor smartpekere erstatter rå new og delete
- unique_ptr og eksklusivt eierskap
- shared_ptr og weak_ptr – delt eierskap
- Tilpassede slettingsfunksjoner og make-funksjoner