tryとcatch
CStringクラスはその初期化時にCMemoryExceptionが発生する可能性がある(ということが書いてある)。しかし、通常は起らないだろう。私の場合、Visual C++ Ver1.0の時から、要するにVisual C++が日本に入ってきた時からMFCを使ってきたが、こういうことは起こったことはなかった。
LOG
124.37.71.210 [19/Oct/2006:17:32:22] cstring mid try catch
もっともらしい言葉を並べているがバカ丸出しである。また、こういう書き方はプログラミングをしている者の感覚ではありえないものである。
「cstring」と書いているから「MFC」のようにみえるが、後の「try」「catch」はC++言語の書き方である。要するに、書き方がチグハグで、ごちゃ混ぜなのである。ということはただのコピペ屋のゴミか。
C++なら「try」「catch」、MFCなら「TRY」「CATCH」になる。このオトコのように大文字小文字をいい加減に使うと、「try」「catch」がC++のものかMFCのものか、それが判別できないのである。
MFCとC++では機能に明確な差があるからこの差異はなおさら重要である。しかし、そんなことはコピペ屋のハエにはどうでもいいことである。そんな知識もない。もともとこういうネットバカはMFCとC++の区別もできないのだから。
重要
- TRY,CATCH
例外がMFCのマクロのCATCHを使ってキャッチされたときはCExceptionオブジェクトは自動的に削除される。
- try,catch
しかし、C++のcatchキーワードを使って例外をキャッチしたときはCExceptionオブジェクトは自動的には削除されない。
したがって、それを自前で削除する(Buhin6.vcprojのWeb2.cppの例)必要がある。ここが重要なのである。
なお、Midについては次のようになっている。
資料
CString Mid( int nFirst ) const;
throw( CMemoryException );
CString Mid( int nFirst、 int nCount ) const;
throw( CMemoryException );
マニュアルによれば、上で出てくるCMemoryExceptionクラスのコンストラクタについて、このコンストラクタは直接使わずに、グローバル関数のAfxThrowMemoryExceptionを呼び出せ、となっている。
このグローバル関数は、あらかじめ確保したメモリに例外オブジェクトを構築するので、メモリ不足状態でも機能するからである。メモリ関係のエラーではメモリー不足になっていることが多く、その例外関数自体が動作しないことがあるからである。
- 2006/10/19 -
try/catchの使い方(ccp_6028)
LOG
202.225.5.123 [17/Nov/2015:18:31:39] catch mfc C++
こういう書き方はプログラミングをしている者にはありえない(上述)。
タコの殿堂
基本がわかってないものにはソースは不要ね(笑)。