0

この ATL/COM コードが割り当ての成功をチェックするのはなぜですか? CoGetALloc またはそのような API を介してカスタム割り当てが表示されることを期待していました。標準準拠の C++ ランタイムは std::bad_alloc をスローする必要がありますが、スローしない impl とアロケーターが実際に交換されている可能性があります。

DDClientData* pNewData = new DDClientData();
if (pNewData==NULL)
    return E_OUTOFMEMORY;
4

2 に答える 2

1

COMメソッドは例外を出すことを許可されていません-実装は例外をスローできますが、メソッドをエスケープして適切なHRESULTに変換する前に例外を処理する必要があります。

上記のコードは望ましい効果をもたらしません-一度new失敗std::bad_allocするとスローされ、nullポインタのチェックは実行されません。実装は、new呼び出しをtry-にラップするかcatch、メソッド実装全体をtry-にラップする必要がありcatchます。ATLは通常、呼び出しの周りに_ATLTRYのようなマクロを使用しnewます。

于 2010-06-29T05:34:30.163 に答える
1

COM は例外を使用しません。どの COM オブジェクトもHRESULT、失敗時に有効な値を返すことになっています。さらに、準拠する COM オブジェクトが準拠する必要がある、終了時の戻り値の設定に関する保証があります。これらの理由により、例外は COM/ATL でうまく機能せず、Microsoft[1] の内部では割り当てにも使用されません。上記のコード サンプルは、その規則を単に反映したものです。

[1] MS FTE の Sez me です。MS の COM コンポーネントは、C++ 例外を無効にしてコンパイルされます。

于 2010-06-28T14:43:20.903 に答える