c ++异常处理按引用传递:抛出的地址与捕获的地址不同?

时间:2012-04-04 00:38:08

标签: c++

#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是不同的,知道为什么吗?

2 个答案:

答案 0 :(得分:7)

抛出异常时,会复制一份。您正在查看该副本的地址。

(处理程序的异常如何具有相同的地址?当你抛出时,你退出了包含异常的块,因此它不再存在。你无法访问不存在的东西。)

答案 1 :(得分:1)

这是有道理的。抛出异常时会复制该异常,以便它可以在退出其原始堆栈帧时继续存在。一旦该异常退出它发起的{}块,就会弹出该堆栈帧,并且其中的所有本地都消失了。所以必须复制它。