Eğer referans olarak yakalamak beri Her iki durumda da, etkili (siz ikamet olarak düşünebiliriz orijinal istisna nesnesinin durumunu değiştiriyoruz müteakip çözülmesi sırasında geçerli kalacak büyülü hafıza konumu - 0x98e7058örneğin aşağıda). Ancak,
- İlk durumda, yeniden attığınız için
throw;(bunun tersine throw err;, orijinal istisna nesnesini yaptığınız değişikliklerle, söz konusu "büyülü konumda" adresinde koruyan 0x98e7058) , append () çağrısını yansıtacaktır.
- Açıkça bir şey atmak beri ikinci durumda, bir kopyası ait
errardından farklı "büyülü bir konumda" nde (yeniden atılmış oluşturulan edilecek 0x98e70b0- herkes için derleyici bildiği için errolarak açılmalıdır üzere gibi, yığın bir nesneyi olabilir eoldu adresindeki 0xbfbce430"sihirli konumda" değil 0x98e7058), bu nedenle temel sınıf örneğinin kopyalanması sırasında türetilmiş sınıfa özgü verileri kaybedersiniz .
Neler olduğunu göstermek için basit bir program:
#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;
}
Sonuç:
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
Ayrıca bkz: