std::exit în C++

Oprește imediat programul cu un cod de ieșire; rulează funcțiile atexit și distruge obiectele statice, dar nu și pe cele locale.

Sintaxă
[[noreturn]] void exit(int cod);

Ce face std::exit

std::exit(cod) (din <cstdlib>) termină programul din orice punct, nu doar din main. Codul de ieșire ajunge la sistemul de operare: 0 sau EXIT_SUCCESS înseamnă succes, EXIT_FAILURE (de obicei 1) înseamnă eroare. Scripturile și alte programe verifică acest cod.

Înainte de oprire, exit apelează funcțiile înregistrate cu std::atexit, distruge obiectele globale și statice și golește fluxurile de ieșire. Obiectele locale (de pe stivă) nu sunt distruse, deci destructorii lor nu rulează. De aceea, în main este preferabil return cod;.

Parametri

Parametru Descriere
cod Codul de ieșire: EXIT_SUCCESS, EXIT_FAILURE sau alt număr.

Ce returnează

Nu revine niciodată.

Exemple

Exemplul 1: Ce se execută la exit

Destructorul obiectului static rulează, cel al obiectului local nu.

#include <cstdlib>
#include <print>

struct Resursa {
    const char* nume;
    ~Resursa() { std::println("Închid {}", nume); }
};

void la_final() {
    std::println("Funcția atexit rulează");
}

int main() {
    static Resursa jurnal{"jurnalul (static)"};
    Resursa fisier{"fișierul (local)"};

    std::atexit(la_final);
    std::println("Opresc programul");
    std::exit(EXIT_SUCCESS);
}

Rezultat

Opresc programul
Funcția atexit rulează
Închid jurnalul (static)

Exemplul 2: Ieșire cu cod de eroare

#include <cstdlib>
#include <fstream>
#include <print>

void incarca_configurare() {
    std::ifstream f("config.txt");
    if (!f) {
        std::println(stderr, "Eroare: fișierul config.txt lipsește");
        std::exit(EXIT_FAILURE);
    }
}

int main() {
    incarca_configurare();
    std::println("Configurare încărcată");
}

Rezultat (programul se oprește cu codul 1)

Eroare: fișierul config.txt lipsește

Greșeli frecvente

  • Folosești exit în mijlocul programului și te bazezi pe destructori (fișiere, conexiuni) ca să salveze date: obiectele locale nu sunt distruse. Aruncă o excepție sau returnează din main.
  • Apelezi exit dintr-un destructor al unui obiect static sau dintr-o funcție atexit: comportament nedefinit.

Comenzi înrudite

  • std::system: Rulează o comandă în shell-ul sistemului de operare și așteaptă să se termine.
  • std::getenv: Citește valoarea unei variabile de mediu (de exemplu HOME sau PATH); returnează nullptr dacă nu există.