所有権に関する規則は、特定のライブラリに関するものではないことに注意してください (規則を尊重する適切に作成されたライブラリを想定しています!)。
ほとんどの場合、それらはすべて常識に関するものです。
- メソッドからパラメーターを受け取ると、その所有者になります。
常識: メソッドが値を返したオブジェクトは、パラメータ値がどのように使用され、いつ不要になるかを知る方法がありません。所有権を放棄するしかありません。あなたが新しい所有者になります。
- パラメータを「値渡し」でメソッドに渡す場合でも、所有者はあなたです。
常識: メソッドは、パラメーターがどこから来たのかを知りません。まだ必要かどうかを知る方法はありません。したがって、所有者になることはできません。あなたは。
パラメータを「参照渡し」でメソッドに渡す場合:
- あなたは引き続き参照の所有者です( 2. を参照)。
- 渡した値の所有権を放棄します。
- 返された値の所有権を取得します。
常識:メソッドは、参照が指すものを変更できます。これが発生するかどうかを事前に知ることはできないため、メソッドに送信される値の有効期間を制御することはできず、メソッドの所有権を放棄する必要があります。メソッドが参照が指す値を置き換える必要がある場合は、それを解放する必要があります。
また、メソッドが参照ポイントを別のものにするか、元の値をそのままにしておくかに関係なく、メソッドはその値で何をするかを制御できないため ( 1. を参照)、呼び出しの最後にその所有権を放棄する必要があります。 .
メソッドが参照が指すものを変更しない場合、メソッドは基本的にパラメーター値の所有権を取得し、返されるときに同じ所有権を同じ値に放棄します。
知っている; これはすべて悪いにおいがするかもしれません...通常、メソッドによって返される基になるオブジェクトを所有していないことを知っています。たとえば、特定のメソッドから取得したオブジェクトは、同じメソッド (たとえば、何らかの->GetCurrentSession()
メソッド) への同一の呼び出しによって返された同じオブジェクトであることが意味的に理解される場合があります。しかし、オブジェクトを所有しているとは言いませんでした。パラメーター値を所有していると言いました。そのような場合のパラメーター値は、COM インターフェイス ポインターです。この場合の所有権とは、処理->Release()
が終わったらそれを呼び出さなければならないということです。これは、同じ基礎となるオブジェクトへの他の Interface ポインターには影響しません。
いくつかの情報を追加するために更新されました:
特定のタイプについては混乱を招く可能性がありますが、何をすべきかを知るためにレイヤーを剥がす必要があります:
- BSTR はメモリへのポインタです。はい、参照によってメモリを渡しますが、COM では基になるメモリではなくポインターを管理します。したがって、「値による」/「参照による」議論は、BSTR (ポインター) 自体に適用されます。つまり、
BSTR
パラメータは「値渡し」、aBSTR*
は「参照渡し」です。
- VARIANT には値が含まれることもあれば、参照が含まれることもあります。ただし、COM では、基になる値を直接管理することはありません。VARIANT を管理します。「値による」は VARIANT に適用され、基になる参照は VARIANT の所有者が を呼び出すときに処理されます
VariantClear(...)
。
@afriza: あなたが言及したコードは、これらの文字列をリークしています。