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

Sam*_*m J 2 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;
}
Run Code Online (Sandbox Code Playgroud)

该程序的输出:

addr1:6d78c020
addr2:20a1080
My exception happened
Run Code Online (Sandbox Code Playgroud)

问题:你看到addr1和addr2是不同的,任何想法为什么?

GMa*_*ckG 7

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

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

  • @SamJ:你错过了这一点.有两个不同的对象,本地对象`myex`,它位于函数的堆栈中,*thrown*对象(`throw`表达式从堆栈复制到编译器定义的位置).然后,如果按值捕获,则会从捕获异常的函数中的*thrown*对象执行第二个副本到堆栈.请注意,必须保留原始异常,以防你`throw;`,并且它不能是`myex`,因为堆栈(可能)解开了. (3认同)
  • `throw`是制作副本的原因.您正在捕获引用,但它是对`throw`所创建的副本的引用. (2认同)