C++ Academy · leksjon

RAII-prinsippet

Knytt ressurser til objektets levetid

Leksjon 1 av 413 trinn

RAII-prinsippet 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.

Hva RAII betyr

RAII står for Resource Acquisition Is Initialization. En ressurs anskaffes i en konstruktør og frigjøres i destruktøren, slik at levetiden knyttes til et objekt.

Grunntanken

Pakk alle ressurser – minne, filer, låser og sockets – inn i et objekt. Når objektet går ut av scope, frigjør destruktøren ressursen automatisk.

#include <iostream>

class Resource {
public:
    Resource() { std::cout << "acquire\n"; }
    ~Resource() { std::cout << "release\n"; }
};

int main() {
    Resource r;   // acquired
}                 // released automatically

Hvorfor RAII er kraftig

Oppryddingen er garantert selv om en funksjon returnerer tidlig eller et unntak kastes. De kan aldri glemme å frigjøre en ressurs som De har pakket inn.

En liten RAII-innpakning

Her er en int-eier som frigjør minnet på heapen i destruktøren – ingen manuell delete på kallestedene.

#include <iostream>

class IntBox {
    int* p;
public:
    IntBox(int v) : p(new int(v)) {}
    ~IntBox() { delete p; }
    int get() const { return *p; }
};

int main() {
    IntBox b(42);
    std::cout << b.get() << "\n";
}

Opprydding ved tidlig retur

Fordi destruktøren kjører når scopet avsluttes, utløser også en tidlig return opprydding.

#include <iostream>

class Guard {
public:
    ~Guard() { std::cout << "cleaned\n"; }
};

void work(bool stop) {
    Guard g;
    if (stop) return;   // g still cleaned
    std::cout << "more work\n";
}

int main() { work(true); }

Opprydding ved unntak

Hvis et unntak avvikler stacken, ødelegges alle fullstendig konstruerte RAII-objekter på veien. Ressurser blir aldri forlatt uten opprydding.

Standardtyper for RAII

Standardbiblioteket er fullt av RAII: std::unique_ptr, std::lock_guard, std::fstream og std::vector rydder alle opp i destruktørene sine.

#include <vector>
#include <memory>

int main() {
    std::vector<int> v{1, 2, 3};        // frees its buffer
    auto p = std::make_unique<int>(9);  // frees its int
}

Ingen manuell oppryddingskode

Med RAII slutter De å skrive delete, fclose eller unlock for hånd. De destruktørkallene kompilatoren setter inn, gjør det for Dem.

Én eier per ressurs

Hver ressurs bør ha én enkelt RAII-eier som er ansvarlig for å frigjøre den. Sikker deling av eierskap krever spesialtyper som std::shared_ptr.

RAII kan settes sammen

Et RAII-objekt kan inneholde andre RAII-objekter. Destruksjonen forplanter seg automatisk, slik at komplekse ressurser ryddes opp korrekt.

#include <memory>
#include <vector>

struct Session {
    std::vector<int> data;                 // RAII
    std::unique_ptr<int> token;            // RAII
};   // both members freed automatically

RAII kontra manuell håndtering

Manuell håndtering er feilutsatt; RAII gjør korrekt opprydding til standard. Foretrekk RAII-innpakninger fremfor rå par av anskaffelse og frigjøring i alle tilfeller.

Hurtigsjekk

Test forståelsen av RAII.

Oppsummering

De har lært RAII-prinsippet: Ressursen anskaffes i konstruktøren og frigjøres i destruktøren. Dette garanterer opprydding ved normal avslutning, tidlig retur og unntak. Standardbiblioteket bruker RAII overalt, og det bør koden Deres også gjøre.

Gratis å komme i gang

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 «RAII-prinsippet» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien C++ Academy, inkludert «RAII-prinsippet», 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 «RAII-prinsippet»?

Knytt ressurser til objektets levetid 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 «RAII-prinsippet»?

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

  1. RAII-prinsippet
  2. Destruktører og opprydding
  3. Tre-/femregelen
  4. Scope-vakter
← Tilbake til C++ Academy