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 に答える