Gestione delle eccezioni.

di il
1 risposte

Gestione delle eccezioni.

Come faccio per verificare che i distruttori degli oggetti creati in un blocco sono chiamati prima che venga lanciata un' eccezione in tale blocco ?

1 Risposte

  • Re: Gestione delle eccezioni.

    Salve,
    se ho capito il suo dubbio potrebbe provare ad inserire dei messaggi da stampare su output nel costruttore di copia e nel distruttore di una classe e sfruttare il fatto che quando viene eseguito il throw viene inizializzato tramite copia un oggetto temporaneo che poi viene passato come argomento al catch corrispondente. Se quest'ultimo lo riceve per copia e non per riferimento verrà chiamato nuovamente il costruttore di copia. Ad esempio un codice come
    
    #include <iostream>
    using namespace std;
    
    struct A
    {
        A () {}
        A(const A &) {cout << "costruttore di copia\n";}
        ~A() {cout << "distruttore\n";}
    };
    
    int main()
    {
        try{
            A a;
            throw a;
        }
        catch(A b) {cout << "catch\n";}
        cout << "nel main\n";
    }
    
    può vedere l'ordine in cui vengono chiamati costruttore di copia e distruttore.
    L'output che si ottiene è questo
    
    costruttore di copia
    distruttore
    costruttore di copia
    catch
    distruttore
    distruttore
    nel main
    

    da cui si può evincere che viene
    1) lanciata l'eccezione
    2) chiamato il distruttore di a
    3catturata l'eccezione inizializzando per copia b
    4) etc...
    Sperando di esserle stato utile ed aver compreso la sua richiesta, la saluto.
Devi accedere o registrarti per scrivere nel forum
1 risposte