উভয় ক্ষেত্রেই, যেহেতু আপনি রেফারেন্স অনুসারে ধরেন, আপনি কার্যকর ব্যতিক্রমী অবজেক্টের অবস্থাকে কার্যকরভাবে পরিবর্তন করছেন (যা আপনি যাদুকরী মেমরির অবস্থানের হিসাবে ভাবতে পারেন যা পরবর্তী অন্বেষণের সময় বৈধ থাকবে - 0x98e7058
নীচের উদাহরণে)। যাহোক,
- প্রথম ক্ষেত্রে, যেহেতু আপনি পুনর্বিবেচনা করেছেন
throw;
(যা পরিবর্তিত throw err;
মূল ব্যতিক্রমী অবজেক্টটি সংরক্ষণ করে, আপনার পরিবর্তনগুলি সহ "যাদুকরী অবস্থান" এ বলা হয়েছে 0x98e7058
) সংযোজনের কলটি প্রতিফলিত করবে ()
- দ্বিতীয় ক্ষেত্রে, যেহেতু আপনি স্পষ্টভাবে কিছু নিক্ষেপ করেছেন তাই এর একটি অনুলিপি তৈরি করা
err
হবে এবং আবার নতুন করে ছুঁড়ে ফেলা হবে (একটি ভিন্ন " icalন্দ্রজালিক অবস্থানে" 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
আরও দেখুন: