CMemoryExceptionについて質問ですが、
void _Init()
{
PSS_TEST* pRet = new PSS_TEST;
return pRet;
}
void Read( CFile& cFile ){
TRY
{
m_pPss = _Init();
cFile.Read( &m_Pss, sizeof(PSS_TEST) );
}
CATCH(CFileException, e )
{
}
AND_CATCH( CMemoryException* p )
{
p->Delete();
}
END_CATCH
}
上記の場合にメモリ確保に失敗しても
CMemoryExceptionには飛んできますでしょうか?
よろしくお願いいたします。
環境:WinXP VC++ MFC6.0
TRY
CATCH
AND_CATCH
END_CATCH
これは何ですか?
C++ですか?
>C++ですか?
MFCのときによく使うマクロです。
>CMemoryExceptionには飛んできますでしょうか?
_Init()でCMemoryExceptionをthrowするとかして実際に試してみては?
実際に試していないので正確じゃありません。
# 俺にはMFC6.0とかかれてもピンとこないな。
newが失敗したときどうなるのか?
という質問なら
実際どうなるかはVCのバージョンとか
ハンドラかコンパイル設定でいじってたりすれば変わる。
前のVCは例外じゃなくてNULLを返す。
最近のVCはnew失敗でSTLの例外だす。
などなど
# ということでよくわからない
_Init()内からのthrowをRead( CFile& cFile )内のtry-catchで
受け取れるかという質問なら受け取ることはできます。
但し_Init()内からCMemoryExceptionをthrowしているか
どうかが気になるところだね。
# MFC使っていると自動でnewがSTLじゃなくてMFCの例外を出すように
# なっていたのかどうかわからないので試してみないと俺にはわからん。
# 俺はVCのバージョンごとに正確に覚えてないので
VC6なら確か、
例外ではなくNULLを返していたと思います。
VC6のヘルプ「operator new 関数」より抜粋。
割り当て要求に応じられるだけの十分なメモリがないと、operator new はデフォルトで NULL を返します。このデフォルト動作を変更するには、カスタム例外処理ルーチンを記述し、この関数名を引数として、_set_new_handler ランタイム ライブラリ関数を呼び出します。この回復方法の詳細については、「メモリ不足状況の扱い」を参照してください。
つまり、VC6ではメモリ確保に失敗してもCMemoryExceptionは飛んできません。
(デフォルトでは)
関係ないけど、
TRY
CATCH
AND_CATCH
END_CATCH
このマクロは使用が推奨されてなかったんじゃなかった?
ツイート | ![]() |