1

IUnknown->Release() ドキュメントからの引用: 「呼び出し元への注意 インターフェイス ポインターを使用する必要がなくなったら、このメソッドを呼び出します。in-out パラメーターを受け取るメソッドを作成している場合は、渡すポインターで Release を呼び出します。その上に出力値をコピーする前に入力してください。」

1. 以下のコードで pDocument->Release() を呼び出した後、@rc 変数は 1 に等しくなります。pDocument に対して Release を 2 回呼び出す必要がありますか?

2. IDispatch の参照カウントが増加するのはどのような場合ですか?

3.IDispatch を関数にポインタとして渡すと、IDispatch の参照カウントは増加しますか?

4.何十もの IDispatch* オブジェクトがあるので、そのうちのどれかを Release() するのを忘れたらどうしますか? メモリーリーク?

5.すべての IDispatch* を簡単にリリースする方法はありますか? それとも手動でリリースする必要がありますか?

AutoWrap(DISPATCH_METHOD, &result.GetVARIANT(), pDocuments, TEXT("Close"), 1, saveChanges.GetVARIANT());

AutoWrap(DISPATCH_METHOD, &result.GetVARIANT(), pWApp, TEXT("Quit"), 0);

//Finalizing
if (pWApp)
{
    pWApp->Release();
    pWApp = NULL;
}
if (pDocuments)
{
    ULONG rc = pDocuments->Release();
    pDocuments = NULL;
}
if (pActiveDocument)
{
    pActiveDocument->Release();
    pActiveDocument = NULL;
}
4

1 に答える 1

3

1. 以下のコードで pDocument->Release() を呼び出した後、@rc 変数は 1 に等しくなります。pDocument に対して Release を 2 回呼び出す必要がありますか?

いいえ。これは、他の誰かがこのオブジェクトへの参照も保持していることを意味し、オブジェクトをその下から削除しても、彼らは面白くありません。

2. IDispatch の参照カウントが増加するのはどのような場合ですか?

それを呼び出すときAddRef、または同じオブジェクトを参照する他のインターフェイス ポインターを呼び出すとき。

3.IDispatch を関数にポインタとして渡すと、IDispatch の参照カウントは増加しますか?

いいえ、自動的ではありません。もちろん、関数はそれに対して自由でAddRefあり、関数が戻った後に使用できるようにポインターをどこかに保存する必要がある場合はそうします。

4.何十もの IDispatch* オブジェクトがあるので、Release() を忘れたらどうなりますか? メモリーリーク?

はい。編集したもの、編集したもの、または編集したfreeものを忘れたときに起こるのと同じことです。mallocdeletenewfclosefopen

5.すべての IDispatch* を簡単にリリースする方法はありますか? それとも手動でリリースする必要がありますか?

CComPtrまたは などのスマート ポインターを見てください_com_ptr_t

于 2013-10-22T21:23:17.720 に答える