cattura oggetti eccezione per riferimento, provvisori, problemi di durata

StackOverflow https://stackoverflow.com/questions/1860064

  •  13-09-2019
  •  | 
  •  

Domanda

Si consideri il seguente codice:

#include <iostream>
#include <stdexcept>

void foo()
{
    throw std::runtime_error("How long do I live?");
}

int main()
{
    try
    {
        foo();
    }
    catch (std::runtime_error& e)
    {
        std::cout << e.what() << std::endl;
    }
}

Perché è possibile intercettare l'eccezione per riferimento, non è un std::runtime_error("How long do I live?") rvalue?

Come mai l'oggetto eccezione è ancora vivo nel blocco catch?

Dove esattamente sono memorizzati gli oggetti eccezione generata? Qual è la loro vita?

Nessuna soluzione corretta

Altri suggerimenti

Nella serie C ++, paragrafo 15.1.4:

  

La memoria per la copia temporanea   l'eccezione è essere buttato   allocata in modo non specificato,   salvo quanto indicato in 3.7.3.1. Il   temporanea persiste fintanto che non v'è   un gestore in corso di esecuzione per questo   eccezioni . In particolare, se un   handler esce eseguendo un tiro;   dichiarazione, che passa il controllo a   un altro gestore per lo stesso   eccezione, così i resti temporanei.   Quando viene eseguito l'ultimo gestore   per le uscite di eccezione con qualsiasi mezzo   diverso da buttare; l'oggetto temporaneo   è distrutta e l'attuazione   può rilasciare la memoria per la   oggetto temporaneo; tale   deallocazione è fatto in un non meglio specificato   modo. La distruzione avviene   subito dopo la distruzione di   l'oggetto dichiarato nel   eccezioni dichiarazione nel gestore.

Si noti che, in C ++ -. Standard parlare, un gestore denotano un blocco catch con il tipo di argomento corretto

Un'eccezione generata non è una temporanea - il codice di eccezione generato dal compilatore mantiene una copia permanente di esso. Quindi è possibile associare ad un punto di riferimento non-const.

[modifica] Ho solo controllare il livello e si riferisce in realtà ad una copia temporanea. Tuttavia, la durata della temporanea è garantita per almeno finché quella del gestore di eccezioni.

Come ha detto Neil, non c'è magia compilatore interno in corso. Inoltre, essere consapevoli del fatto che il compilatore è permesso di creare qualsiasi numero di copie dell'oggetto eccezione.

Complimenti per cercare di capire i dettagli del linguaggio. Allo stesso tempo, secondo me, è molto più importante capire il motivo per cui dovrebbe catturare un'eccezione per riferimento (e gettarlo per valore), di cui si possono .

La gente in genere utilizzano una gerarchia di classi di eccezioni, e la cattura con riferimento consente di sfruttare il polimorfismo, e rilevare un'eccezione della classe base, quando non v'è alcuna necessità di gestire i singoli tipi di eccezione separatamente. Se non si poteva prendere per riferimento, si sarebbe dovuto scrivere una clausola di catch per ogni possibile tipo di eccezione che può essere gettato nella clausola try.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top