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

4

2 回答 2

7

当抛出异常时,会生成一个副本。您正在查看该副本的地址。

(处理程序的异常怎么可能有相同的地址?当你抛出时,你退出了包含异常的块,所以它不再存在。你不能访问不存在的东西。)

于 2012-04-04T00:41:35.737 回答
1

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

于 2012-04-04T00:43:27.773 回答