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
err
ardından farklı "büyülü bir konumda" nde (yeniden atılmış oluşturulan edilecek 0x98e70b0
- herkes için derleyici bildiği için err
olarak açılmalıdır üzere gibi, yığın bir nesneyi olabilir e
oldu 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: