2014-09-01 3 views
1

Нельзя выбрасывать исключение из такой функции?
В Eclipse это работает ...
Так это правда? и мы можем бросить внутренний объект в метании исключений?можно ли исключить внутреннее исключение объекта из функции

class Bad { 
    int i; 
public: 
    void what() { cout << "exp" << i; } 
}; 

class A { 
public: 
    void f() { 
     Bad e; 
     throw e; 
    } // e are deleted by d'tor? 
}; 

int main() { 
    A a; 
    try { 
     a.f(); 
    } catch (Bad& e) // What happen here? we catch reference to some object that 
        // was deleted by Bad dt'or 
    { 
     cout << "in catch"; 
     e.what(); // what happen here? 
    } 
    return 0; 
} 
+1

Совершенно очевидно, что это не дубликат, @ bames53. –

+0

Работает идентично 'return e;' вместо того, чтобы возвращать локальный, создает копию. – Vladp

+0

@LightnessRacesinOrbit Мне кажется довольно ясно, что это дубликат. http://stackoverflow.com/questions/1860064/catching-exception-objects-by-reference-temporaries-lifetime-issues. Оба вопроса задают вопрос о том, как возможно, что объект, который будет уничтожен при выходе из области, может быть пойман по ссылке, потому что не должна ли эта ссылка быть недействительной в этот момент? – bames53

ответ

3

Ваш код в порядке. throw e; делает копию e, которая разрушена после Исправление выполнено. Обработчику дается ссылка на эту копию.

У вас могут возникнуть проблемы, если вы указали указатель на локальную переменную; переменная будет уничтожена перед обработкой исключения, оставив указатель недействительным. Но бросать указатель было бы довольно странным делом в любом случае.

+0

так, зачем выбрасывать e == throw Bad (e) .. Я думаю, что это очень странно .. –

+0

@ItayAveksis: Потому что метать объект указан, чтобы сделать копию объекта, поскольку это позволяет избежать проблемы, которую вы описываете в вопрос: сам объект уничтожается во время разворачивания стека, прежде чем обрабатывается исключение. Это не совсем то же самое, что «throw Bad (e)», что сделало бы * две * копии: временную «Bad (e)» и копию того, что было выбрано. –

+0

спасибо. теперь понимается –

Смежные вопросы