2013-09-03 2 views
4

При использовании throw в функции, напримерГде выбрасываются объекты?

try { 
    // ... 
    throw MyExceptionType() 
    // ... 
} catch(MyExceptionType& exp){ /* ... */ } 

Где MyExceptionType выделяется? Это в стеке? Если да, безопасно ли изменить exp в моем блоке catch? Как насчет вызова некоторых других функций внутри catch и использования стека?

В подобном случае у меня есть:

try { 
    char my_array[32]; 
    throw my_array; 
} catch(char* error_string){ /* ... */ } 

ли error_string указывая куда-то в стеке процесса? Могу ли я запускать массив, если я вызываю некоторые функции внутри блока catch?

+3

Ответит ли это на ваш вопрос? http://stackoverflow.com/questions/2404288/how-are-exceptions-allocated-on-the-stack-caught-beyond-their-scope – HAL

+1

Ссылка HAL имеет хорошее объяснение. Интересно, как C++ 11 защищал поток «особого места». –

+1

@brianbeuning: сообщая компиляторам, что это должно быть :) – user1233963

ответ

2

Это зависит от реализации. g++ 4.4 пытается получить malloc память, и если этот сбой пытается создать исключение в системном аварийном буфере, сбой всего, что он называет std::terminate.

1

Это поведение, которое зависит от реализации, а также строго связано с используемым ABI.

Если вы находитесь под Linux/unix, я предлагаю взглянуть на libsupc++ от GNU.

В двух словах это похоже на любую другую библиотеку, у вас нет стандартной реализации для каждой стандартной библиотеки компилятора/C++, но вам нужно взглянуть на то, как данная инструкция реализуется тем, кто написал библиотеку.

1

Это зависит от реализации. В разных реализациях есть политики , но по большей части они включают в себя некоторое предопределенное пространство , статическое или потоковое локальное. (Если нужно выделить, чтобы бросить std::bad_alloc, вы в неприятности.)

Что касается второго случая, это не очень похоже, потому что массив для преобразования указателя происходит перед броском. Так что вы действительно только бросаете указатель; пространство для указателя обрабатывается как обычным, но как только вы покинули блок, где был объявлен массив , он исчез. Даже в блоке catch (в вашем примере ) доступ к нему является неопределенным поведением.

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