ex をスローすると、スローされた例外オブジェクトに使用される特別なメモリ位置にコピーされます。このようなコピーは、通常のコピー コンストラクターによって実行されます。
これは、次の例から簡単に確認できます。
#include <iostream>
void ThrowIt();
class TestException
{
public:
TestException()
{
std::cerr<<this<<" - inside default constructor"<<std::endl;
}
TestException(const TestException & Right)
{
(void)Right;
std::cerr<<this<<" - inside copy constructor"<<std::endl;
}
~TestException()
{
std::cerr<<this<<" - inside destructor"<<std::endl;
}
};
int main()
{
try
{
ThrowIt();
}
catch(TestException & ex)
{
std::cout<<"Caught exception ("<<&ex<<")"<<std::endl;
}
return 0;
}
void ThrowIt()
{
TestException ex;
throw ex;
}
出力例:
matteo@teolapubuntu:~/cpp/test$ g++ -O3 -Wall -Wextra -ansi -pedantic ExceptionStack.cpp -o ExceptionStack.x
matteo@teolapubuntu:~/cpp/test$ ./ExceptionStack.x
0xbf8e202f - inside default constructor
0x9ec0068 - inside copy constructor
0xbf8e202f - inside destructor
Caught exception (0x9ec0068)
0x9ec0068 - inside destructor
ちなみに、ここで、スローされたオブジェクト (0x09ec0068) に使用されたメモリの場所が、元のオブジェクト (0xbf8e202f) のメモリの場所から離れていることがわかります。スローされたオブジェクトは、仮想アドレス空間でかなりダウンしています。それでも、これは実装の詳細です。他の回答が指摘したように、標準では、スローされたオブジェクトのメモリをどこに配置し、どのように割り当てる必要があるかについて何も述べていません。