#include <iostream>
#include <exception>
using namespace std;
class myexception: public exception
{
virtual const char* what() const throw()
{
return "My exception happened";
}
};
int main ()
{
try
{
myexception myex;
printf("addr1:%x\n",&myex);
throw myex;
}
catch (exception& e)
{
printf("addr2:%x\n",&e);
cout << e.what() << endl;
}
return 0;
}
addr1:6d78c020
addr2:20a1080
My exception happened
问题:你看到addr1和addr2是不同的,知道为什么吗?
答案 0 :(得分:7)
抛出异常时,会复制一份。您正在查看该副本的地址。
(处理程序的异常如何具有相同的地址?当你抛出时,你退出了包含异常的块,因此它不再存在。你无法访问不存在的东西。)
答案 1 :(得分:1)
这是有道理的。抛出异常时会复制该异常,以便它可以在退出其原始堆栈帧时继续存在。一旦该异常退出它发起的{}
块,就会弹出该堆栈帧,并且其中的所有本地都消失了。所以必须复制它。