« std::vector見てみた | Main | C++ Vectorその後 »

2007.08.20

C++の例外ってすごい

今日気がついたけど、例外ってすごい。変数がスコープをはずれたらデストラクタを呼ぶのは分かる。スコープがはずれる所に、デストラクタを呼び出すコード入れればよいから。でも、例外だったらcatchされるまで、順に関数呼び出しを戻っていって、スコープのはずれたオブジェクトのデストラクタを順に呼ぶんだよ。どういう仕組みなんだ?お前実装しろよって言われたら困る。多分、泣く。各関数のお尻にに例外が通ったらこの関数呼んでね?って領域でもあるのだろうか。

a()→b()→c()の順に関数が呼ばれて、c()で例外が発生して、a()でcatchされたとき、b()のスタック上にあるオブジェクトのデストラクタの呼び方って、b()自体でないとわからないよね。各関数に、例外が通るパスa'(), b'(), c'()みたいなエントリーがあって、c()で例外が投げられると、c'()→b'()を通って、a()に制御が移るんだろうか?それだけじゃだめだ。b()のどの位置でc()が呼ばれたかによって、解放するオブジェクトが変わってくる。コンパイル時点では、c()が例外を出すかどうか分からないのが辛いと思う。

手持ちの本をパラパラめくったけど、この仕組みについては全然載ってないな。Inside the C++ Object Modelとか期待していたけど、むしろBinary Hacksの方が情報多そうだ。アセンブラで追うか。

|

« std::vector見てみた | Main | C++ Vectorその後 »

Comments

はじめまして。
最近、C++について学び始めたものですが…。
例外は throw されるときに、一時オブジェクトを作成して
それを投げるようです。それで、元のオブジェクトは
ちゃんとデストラクタで壊される。
そんな仕組みが、『詳説C++』とかいう日本語の本に書いて
ありました。ご参考になれば。

Posted by: hazratt | 2007.08.20 at 09:00 PM

例外に関してはこのようなのはいかがでしょう.
http://www.codesourcery.com/cxx-abi/abi-eh.html

Posted by: ひげぽん | 2007.08.21 at 12:33 PM

hazrattさん
こんにちは。
『詳説C++』を持っていたので読んでみました。ローカル変数は、スタックに積んでおいて、
初期化済みか否かでデストラクタを呼ぶ/呼ばないを変えているようでした。
情報ありがとうございました。


ひげぽんさん
こちらも情報ありがとうございます。
英語ですが、それほどボリュームが多くないので頑張って読んでみます。

Posted by: なつたん | 2007.08.21 at 06:59 PM

概要を知りたいだけなら、こちらの本に例外の実装が3種類書いてあります。

http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=4-274-13308-7

Posted by: ビット | 2007.09.28 at 03:43 AM

ビットさん、こんにちは。
情報ありがとうございます。早速アマゾンのカートに入れました。複数のやり方があるんですね。

Posted by: なつたん | 2007.09.30 at 02:34 PM

Post a comment



(Not displayed with comment.)




TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/18154/16181621

Listed below are links to weblogs that reference C++の例外ってすごい:

« std::vector見てみた | Main | C++ Vectorその後 »