2

を からにreinterpret_cast変換するために を使用した場合でも、元の をリリースする責任はありますか?IInspectable*Object^IInspectable*

明らかに、生成さObject^れたものはスコープ外になるとそれ自体を解放するため、実際の問題は、reinterpret_cast がObject^独自の参照カウントを与える AddRef を意味するのか、それとも既に持っている参照の所有権を取得するのかということです。

いずれかの方法を期待する引数があるようです: 一方では、COM 操作は入力ポインターの参照カウントを引き継ぐべきではありません。他方では、名前は、「生の ABI ポインター」から私のビットを再解釈reinterpret_castするだけであることを示唆しています。 「オブジェクトへの参照を既に所有しているハット付きポインター」に、これが理にかなっていることを確認するのが私の仕事です)。

4

1 に答える 1

3

呼び出し自体には、refcounting に関連するreinterpret_cast<Object^>(iinsp)副作用はありませんが、そのキャストの結果をObject^変数に代入すると、元の IInspectable が指すオブジェクトで addref が発生します。そのObject^変数がスコープ外になるか、null に割り当てられると、Release()同様に、基になるオブジェクトで a が呼び出されます。それによってオブジェクトが範囲外になるかどうかは、このビジネス全体の前の内部参照カウントに依存します。例えば:

void foo(IInspectable* p) {  //assume: this comes in with a single refcount
  p->AddRef(); // refcount now 2
  reinterpret_cast<Object^>(p); //refcount still 2
  {
    Object^ o = reinterpret_cast<Object^>(p); //refcount now 3
  } //o goes out of scope, refcount now 2

  p->Release(); // refcount now 1
} //refcount is still 1, the caller of function foo is responsible for cleaning him up
于 2013-04-11T22:45:28.907 に答える