4

comインターフェースへのポインターがあると仮定すると、私の質問は、Release()呼び出しの後にポインターをnullに設定する必要があるかどうかです。それとも、COMがそれをどのように処理するのでしょうか?

Func1()
{
.....
.....
pComInterface->Release();
pComInterface = NULL;  //---> Does this required? If used, then what is the impact?
}
4

2 に答える 2

7

pComInterfaceたとえば、次のように宣言された生のポインターであると想定します。

IFoo* pComInterface

いいえ、NULL にする必要はありません。これは単なるローカル変数です。IUnknown::Releaseただし、ポインターを解放することをオブジェクトに通知すると、オブジェクトが内部参照カウンターを安全にデクリメントできるため、の呼び出しは必須です。

于 2013-03-12T07:09:29.760 に答える
3

pComInterfaceが何らかの COM インターフェイスへの生のポインタである場合、COM の観点から重要なことはRelease()、オブジェクトの有効期間を適切に管理するために呼び出すことです。NULL(COM は、 への呼び出し後に生のポインタを に設定したかどうかを認識しませんRelease()。)

ただし、良好なコード品質の観点から、以前にリリースされた COM オブジェクトへのダングリング リファレンスがないことを確認するために、 を呼び出した後にNULL(または、nullptrC++11 ではより適切に)へのポインターを設定する必要があります。Release()次のコードがある場合Release()

new(これはand と同様のケースです。オブジェクトのリソースを適切に解放するには、 afterをdelete呼び出す必要があります。ポインターをafterに設定する必要はありませんが、削除されたオブジェクトへの参照がぶら下がるのを避けるための適切なコーディング方法です。)deletenewnullptrdelete

さらに、スマート ポインターを使用して、COM オブジェクト インターフェイスの有効期間を管理することをお勧めしますATL::CComPtr。このようにして、Release()(and AddRef())への適切な呼び出しが自動的に行われます。( と との比較を続けるnewと、生の所有ポインターの代わりにorのようなスマート ポインターdeleteを優先するのと同じ提案です。)shared_ptrunique_ptr

于 2013-03-12T11:17:37.907 に答える