2012-01-20 14 views
0

COMライブラリで、COMインターフェイス上でAddrefを呼び出すことがCOMライブラリで標準的に行われているかどうかは、関数から返されているのでしょうか。例えば:MSXML get_documentElement()&COMインターフェイスへのポインタを返す

IXMLDOMElement* domElement = NULL; 
document_->get_documentElement(&domElement); // does get_documentElement() call Addref on domElement? 
// ... 
// do something with domElement 
// .. 
domElement.Release(); // correct? 
// (btw. member variable document_ is of type CComPtr<IXMLDOMDocument2> 

またはスマートポインタで:ところで

CComPtr<IXMLDOMElement> domElement; 
document_->get_documentElement(&domElement); 

http://msdn.microsoft.com/en-us/library/ms751196(v=vs.85).aspx

しかし、何がそれについて言及されていない公式ドキュメントに: http://msdn.microsoft.com/en-us/library/ms759095(v=vs.85).aspx

答えて

2

はい、あなたがのAddRefすることになっている私は、「Windowsメディア9シリーズ」それはのAddRefが呼び出されると言うためのMSXMLのドキュメントにことがわかりました呼び出し元がオブジェクトを参照する新しいインタフェースポインタを持つため、COMオブジェクトを返す前に、参照カウントを1つ増やす必要があります。これはルールであり例外ではありません。

しかし、参照カウントはCOMの基本の1つであるため、内部のaddrefのドキュメント化は例外です。おそらく、このメソッドの呼び出し元の多くがルールを知らず、あまりにも多くのメモリリークを引き起こしたときに、ドキュメントが書かれた可能性があります。

呼び出し元として、受け取ったオブジェクトが不要になったときに、Releaseを直接または間接に(たとえばクラスデストラクタによって)呼び出す必要があり、リファレンスポインタの使用を停止する必要がありますダングリングポインター)。

2

インターフェイスポインタを返す関数は、オブジェクトを受け取っている関数ではなく、終了する前にAddRef()を呼び出す必要があります。インターフェイスポインタを受け取る関数はそのまま使用し、次にRelease()を呼び出します。つまり、get_documentElement()AddRef()となりますので、自分では電話しないでください。

誰のためのルール - 発信者または呼び出し先が - COMの参照カウントとメモリ管理に関しては何をやって責任があるが明確にMSDN上のCOMのドキュメントで定義されています。

The Rules of the Component Object Model

Reference Counting Rules

関連する問題