2

如果我使用 areinterpret_cast转换 from IInspectable*to Object^,我是否仍负责发布原件IInspectable*

显然,producedObject^会在超出范围时自行释放,所以真正的问题是 reinterpret_cast 是否暗示了一个 AddRef 给Object^它自己的引用计数,或者它拥有我已经拥有的引用的所有权。

无论哪种方式,似乎都有争论:一方面,COM 操作不应该接管其输入指针的引用计数——另一方面,reinterpret_cast顾名思义,它只是从“原始 ABI 指针”重新解释我的位到“已经拥有对对象的引用的戴帽子的指针”,我的工作是确保这是有意义的)。

4

1 回答 1

3

调用本身不会有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 回答