|
|
|
/*
|
|
|
|
* Copyright (c) 2018-present, Facebook, Inc.
|
|
|
|
*
|
|
|
|
* This source code is licensed under the MIT license found in the
|
|
|
|
* LICENSE file in the root directory of this source tree.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
struct B {
|
|
|
|
B() { printf(" Base default constructor, this=%p\n", this); }
|
|
|
|
B(const B& other) {
|
|
|
|
printf(" Base copy-constructor, this=%p from that=%p\n", this, &other);
|
|
|
|
}
|
|
|
|
virtual ~B() { printf(" Base destructor, this=%p\n", this); }
|
|
|
|
};
|
|
|
|
|
|
|
|
struct D : public B {
|
|
|
|
D() { printf(" Derived default constructor, this=%p\n", this); }
|
|
|
|
D(const D& other) {
|
|
|
|
printf(" Derived copy-constructor, this=%p from that=%p\n", this, &other);
|
|
|
|
}
|
|
|
|
virtual ~D() { printf(" Derived destructor, this=%p\n", this); }
|
|
|
|
};
|
|
|
|
|
|
|
|
void f() {
|
|
|
|
D e;
|
|
|
|
throw e;
|
|
|
|
}
|
|
|
|
|
|
|
|
int main() {
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
f();
|
|
|
|
} catch (B& err) {
|
|
|
|
printf("A Inner catch, &err=%p\n", &err);
|
|
|
|
throw;
|
|
|
|
}
|
|
|
|
} catch (B& err) {
|
|
|
|
printf("A Outer catch, &err=%p\n", &err);
|
|
|
|
}
|
|
|
|
printf("---\n");
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
D e;
|
|
|
|
throw e;
|
|
|
|
} catch (B& err) {
|
|
|
|
printf("B Inner catch, &err=%p\n", &err);
|
|
|
|
throw err;
|
|
|
|
}
|
|
|
|
} catch (B& err) {
|
|
|
|
printf("B Outer catch, &err=%p\n", &err);
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|