참조로 잡기 때문에 두 경우 모두, 당신은 효과적으로 (당신이 거주하는 등 생각할 수있는 원래의 예외 객체의 상태를 변경하는 후속 푸는 동안 유효하게 유지되는 마법의 메모리 위치 - 0x98e7058
예 아래에있는을). 하나,
- 첫 번째 경우에 다시 던지기 때문에
throw;
(과 달리 throw err;
원래 예외 객체를 수정하여에서 언급 한 "마법의 위치"에서 0x98e7058
) 는 append () 호출을 반영합니다.
- 명시 적으로 뭔가를 던져 이후 두 번째 경우,하는 사본 의
err
다음 다른 "마법의 위치"에서 (새롭게 던져 만든 될 것이다 0x98e70b0
- 모든 컴파일러는 알고 있기 때문에 err
이 풀리고 수에 대해 같은 스택에 객체가 될 수 e
있었다 에서 0xbfbce430
가 아닌 "마법의 장소"에서의 0x98e7058
), 그래서 당신이 파생 클래스 별 데이터를 잃게됩니다 기본 클래스 인스턴스의 복사 건설 중.
무슨 일이 일어나고 있는지 보여주는 간단한 프로그램 :
#include <stdio.h>
struct MyErr {
MyErr() {
printf(" Base default constructor, this=%p\n", this);
}
MyErr(const MyErr& other) {
printf(" Base copy-constructor, this=%p from that=%p\n", this, &other);
}
virtual ~MyErr() {
printf(" Base destructor, this=%p\n", this);
}
};
struct MyErrDerived : public MyErr {
MyErrDerived() {
printf(" Derived default constructor, this=%p\n", this);
}
MyErrDerived(const MyErrDerived& other) {
printf(" Derived copy-constructor, this=%p from that=%p\n", this, &other);
}
virtual ~MyErrDerived() {
printf(" Derived destructor, this=%p\n", this);
}
};
int main() {
try {
try {
MyErrDerived e;
throw e;
} catch (MyErr& err) {
printf("A Inner catch, &err=%p\n", &err);
throw;
}
} catch (MyErr& err) {
printf("A Outer catch, &err=%p\n", &err);
}
printf("---\n");
try {
try {
MyErrDerived e;
throw e;
} catch (MyErr& err) {
printf("B Inner catch, &err=%p\n", &err);
throw err;
}
} catch (MyErr& err) {
printf("B Outer catch, &err=%p\n", &err);
}
return 0;
}
결과:
Base default constructor, this=0xbfbce430
Derived default constructor, this=0xbfbce430
Base default constructor, this=0x98e7058
Derived copy-constructor, this=0x98e7058 from that=0xbfbce430
Derived destructor, this=0xbfbce430
Base destructor, this=0xbfbce430
A Inner catch, &err=0x98e7058
A Outer catch, &err=0x98e7058
Derived destructor, this=0x98e7058
Base destructor, this=0x98e7058
---
Base default constructor, this=0xbfbce430
Derived default constructor, this=0xbfbce430
Base default constructor, this=0x98e7058
Derived copy-constructor, this=0x98e7058 from that=0xbfbce430
Derived destructor, this=0xbfbce430
Base destructor, this=0xbfbce430
B Inner catch, &err=0x98e7058
Base copy-constructor, this=0x98e70b0 from that=0x98e7058
Derived destructor, this=0x98e7058
Base destructor, this=0x98e7058
B Outer catch, &err=0x98e70b0
Base destructor, this=0x98e70b0
참조 :