私たちはコード内でネイティブCOMサポートを使用しています。 __com_raise_error()が呼び出され、_com_error例外がスローされるという事実が気に入らないという点を除いて、すべてうまくいっています。この_com_errorを捕捉する独自の階層構造を持っているので、これは階層構造ではなく、std :: exceptionから継承しないことさえありません。IErrorInfoの所有者は誰ですか?
したがって、_com_raise_error()をオーバーライドする必要があります。それは単体で簡単です。コード内で定義するだけで、リンカーはそれをリンクします。
ただし、IErrorInfoの所有者は不明です。署名は
void __stdcall _com_raise_error(HRESULT hr, IErrorInfo* info);
です。関数を呼び出す人は誰でも関数が返ってからIErrorInfo :: Release()を呼び出す責任があります。しかし、私たちが例外をスローしてコントロールがどこか他のものに移動すると、関数はどのように戻りますか?
この関数に入るとすぐにAddRef()、次にRelease()が呼び出されました。参照カウンタは1になりました。その後、構築された例外オブジェクトに所有権を渡します。そのコンストラクタではAddRef )デストラクタで。 AddRef()は参照カウントを2に増やしますが、(例外デストラクタでは)1つのRelease()しか呼び出されないので、これは間違っていると思います。
コンストラクタ内のAddRef()がメモリリークを引き起こすか、IErrorInfoオブジェクトがまったくリークできない内部メカニズムがあることを修正しましたか?