comインターフェースへのポインターがあると仮定すると、私の質問は、Release()呼び出しの後にポインターをnullに設定する必要があるかどうかです。それとも、COMがそれをどのように処理するのでしょうか?
Func1()
{
.....
.....
pComInterface->Release();
pComInterface = NULL; //---> Does this required? If used, then what is the impact?
}
pComInterface
たとえば、次のように宣言された生のポインターであると想定します。
IFoo* pComInterface
いいえ、NULL にする必要はありません。これは単なるローカル変数です。IUnknown::Release
ただし、ポインターを解放することをオブジェクトに通知すると、オブジェクトが内部参照カウンターを安全にデクリメントできるため、の呼び出しは必須です。
pComInterface
が何らかの COM インターフェイスへの生のポインタである場合、COM の観点から重要なことはRelease()
、オブジェクトの有効期間を適切に管理するために呼び出すことです。NULL
(COM は、 への呼び出し後に生のポインタを に設定したかどうかを認識しませんRelease()
。)
ただし、良好なコード品質の観点から、以前にリリースされた COM オブジェクトへのダングリング リファレンスがないことを確認するために、 を呼び出した後にNULL
(または、nullptr
C++11 ではより適切に)へのポインターを設定する必要があります。Release()
次のコードがある場合Release()
。
new
(これはand と同様のケースです。オブジェクトのリソースを適切に解放するには、 afterをdelete
呼び出す必要があります。ポインターをafterに設定する必要はありませんが、削除されたオブジェクトへの参照がぶら下がるのを避けるための適切なコーディング方法です。)delete
new
nullptr
delete
さらに、スマート ポインターを使用して、COM オブジェクト インターフェイスの有効期間を管理することをお勧めしますATL::CComPtr
。このようにして、Release()
(and AddRef()
)への適切な呼び出しが自動的に行われます。( と との比較を続けるnew
と、生の所有ポインターの代わりにorのようなスマート ポインターdelete
を優先するのと同じ提案です。)shared_ptr
unique_ptr