Hvorfor smart pointers erstatter rå new og delete
Forstå RAII, og hvorfor ejerskab af rå pointere sjældent er korrekt i moderne C++
Hvorfor smart pointers erstatter rå new og delete er en gratis C++ Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i C++ Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C++ Academy-kurset indeholder 4 lektioner i alt.
Rå new og delete
Arven fra C: new T allokerer en T på heapen, og delete frigiver den. Du skal matche hvert new med præcis ét delete – ellers opstår der en hukommelseslækage eller et nedbrud.
Widget* w = new Widget();
// ... use w ...
delete w; // forget this and you leakHvad der går galt
Almindelige fejl:
- Glemt
delete– hukommelseslækage - Dobbelte
delete– udefineret adfærd - Undtagelse mellem
newogdelete– lækage - Returnering af en rå pointer med uklart ejerskab
RAII kommer til undsætning
Ressourceanskaffelse er initialisering: Knyt en ressources levetid til levetiden for et objekt på stacken. Destruktoren frigiver ressourcen, selv hvis der kastes en undtagelse.
Ideen med en smart pointer
En smart pointer er en lille RAII-wrapper omkring en rå pointer. Dens destruktor kalder delete. Du glemmer aldrig at frigive ressourcen.
De tre smart pointer-typer
Standardbibliotekets smart pointer-typer i <memory>:
std::unique_ptr<T>– ene-ejerskabstd::shared_ptr<T>– delt ejerskab med referencetællingstd::weak_ptr<T>– ikke-ejende observatør af en shared_ptr
Smart pointere er billige
unique_ptr har ingen ekstra omkostning og har samme størrelse og hastighed som en rå pointer. shared_ptr har en lille omkostning til atomær referencetælling.
Ikke mere manuel delete
Med smart pointere skriver du næsten aldrig delete. Destruktoren klarer det.
#include <memory>
std::unique_ptr<Widget> w = std::make_unique<Widget>();
// no delete needed — when w goes out of scope, Widget is destroyedSmart pointere og undtagelser
Hvis der kastes en undtagelse midt i en funktion, destrueres lokale variable i omvendt rækkefølge. Smart pointere frigiver deres ressourcer automatisk, mens rå pointere lækker.
Ejerskab i typen
Smart pointer-typen beskriver nu ejerskabet. Når du læser en funktionssignatur, kan du se, hvem der ejer objektet.
// I take ownership
void consume(std::unique_ptr<Widget> w);
// I look but do not own
void inspect(const Widget& w);Rå pointere findes stadig
Brug rå pointere eller referencer til ikke-ejende adgang. De kommunikerer: "Jeg låner, jeg ejer ikke."
Erstatning af new med make-funktioner
Foretræk std::make_unique (C++14) og std::make_shared (C++11). De er sikre ved undtagelser og en smule mere effektive end at kalde new direkte.
auto w = std::make_unique<Widget>(42);
auto s = std::make_shared<Resource>("file.txt");Hurtigt tjek
Hvad er den vigtigste grund til at bruge std::unique_ptr i stedet for et råt new/delete-par?
Opsummering
Rå new/delete er fejlbehæftede. Smart pointere indkapsler heap-allokerede objekter i RAII-håndtag, der frigiver dem automatisk. Foretræk std::make_unique og std::make_shared af hensyn til sikkerhed og ydeevne.
Lær C++ med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 51
- Lektioner
- 203
Ofte stillede spørgsmål
Er lektionen “Hvorfor smart pointers erstatter rå new og delete” gratis?
Ja — alle 3 lektioner i læringssporet C++ Academy, inklusive “Hvorfor smart pointers erstatter rå new og delete”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. C++ Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Hvorfor smart pointers erstatter rå new og delete”?
Forstå RAII, og hvorfor ejerskab af rå pointere sjældent er korrekt i moderne C++ Du øver dig i C++ Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på C++ Academy?
Der kræves ingen tidligere erfaring. C++ Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.
Hvor lang tid tager lektionen “Hvorfor smart pointers erstatter rå new og delete”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne C++ Academy-lektion?
Ja. Alle C++ Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Hvorfor smart pointers erstatter rå new og delete
- unique_ptr – eksklusivt ejerskab
- shared_ptr og weak_ptr – delt ejerskab
- Brugerdefinerede deleters og make-funktioner