예외로 참조되는 스택 풀기 중 로컬 변수는 어떻게됩니까? 다음 코드를 고려 :로컬 변수에 대한 const 참조가있는 예외 예외
class bar;
class my_error
{
public:
my_error(const bar& bar) : _bar(bar) {}
const bar& get_bar() const { return _bar; }
private:
const bar& _bar;
}
...
bar some_local_object(...);
if (!foo()) {
throw my_error(some_local_object);
}
...
try {
g();
} catch (my_error& e) {
e.get_bar()
...
}
무엇 some_local_object 어떻게됩니까? 스택을 푸는 동안 파괴해서는 안됩니까? 예제에서 제공된대로 사용하는 것이 안전합니까?
추가 질문
로 이미 대답이 코드는 정의되지 않은 동작이 발생할 것입니다. 내 두 번째 질문은 다음과 같습니다.
로컬 객체에 대한 참조를 전달할 권한이 없거나 드문 경우 bad_alloc이 발생할 수 있으므로 사본을 만들지 않아야합니다 (이것이 gcc 표준입니다. 라이브러리에 의미있는 오류 메시지가 없습니다. 즉, map.at에서 what()이 "map.at"을 반환하는 예외를 던지면 추가 정보를 전달하는 좋은 전략은 무엇입니까? 오류 메시지 생성 중에 여러 문자열을 조인해도 이론적으로 bad_alloc이 발생할 수 있습니다. 즉 :
void do_something(const key& k, ....)
{
...
if (!foo(k)) {
std::ostringstream os;
os << "Key " << k << " not found"; // could throw bad_alloc
throw std::runtime_error(os.str());
}
// another approcach
if (!foo(k)) {
throw key_not_found(k); // also bad, because exception could outlive k
}
}
참조를 포함하는 객체를 반환 했으므로 아무런 차이가 없습니다. 따라서 안전하지 않습니다. –