CMemoryException処理


まめた  2008-03-06 01:37:38  No: 67756

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


???  2008-03-06 01:45:13  No: 67757

TRY
CATCH
AND_CATCH
END_CATCH
これは何ですか?
C++ですか?


Blue  2008-03-06 01:53:42  No: 67758

>C++ですか?
MFCのときによく使うマクロです。

>CMemoryExceptionには飛んできますでしょうか?
_Init()でCMemoryExceptionをthrowするとかして実際に試してみては?


wclrp ( 'o')  2008-03-06 17:42:00  No: 67759

実際に試していないので正確じゃありません。
# 俺にはMFC6.0とかかれてもピンとこないな。

newが失敗したときどうなるのか?
という質問なら
実際どうなるかはVCのバージョンとか
ハンドラかコンパイル設定でいじってたりすれば変わる。
前のVCは例外じゃなくてNULLを返す。
最近のVCはnew失敗でSTLの例外だす。
などなど
# ということでよくわからない

_Init()内からのthrowをRead( CFile& cFile )内のtry-catchで
受け取れるかという質問なら受け取ることはできます。

但し_Init()内からCMemoryExceptionをthrowしているか
どうかが気になるところだね。

# MFC使っていると自動でnewがSTLじゃなくてMFCの例外を出すように
# なっていたのかどうかわからないので試してみないと俺にはわからん。
# 俺はVCのバージョンごとに正確に覚えてないので


赤猿  2008-03-08 03:17:42  No: 67760

VC6なら確か、
例外ではなくNULLを返していたと思います。


maru  2008-03-08 04:09:48  No: 67761

VC6のヘルプ「operator new 関数」より抜粋。

割り当て要求に応じられるだけの十分なメモリがないと、operator new はデフォルトで NULL を返します。このデフォルト動作を変更するには、カスタム例外処理ルーチンを記述し、この関数名を引数として、_set_new_handler ランタイム ライブラリ関数を呼び出します。この回復方法の詳細については、「メモリ不足状況の扱い」を参照してください。

つまり、VC6ではメモリ確保に失敗してもCMemoryExceptionは飛んできません。
(デフォルトでは)


アラー  2008-03-08 04:22:14  No: 67762

関係ないけど、
TRY
CATCH
AND_CATCH
END_CATCH
このマクロは使用が推奨されてなかったんじゃなかった?


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加