从原始指针到仇恨指针的reinterpret_cast有哪些引用计数规则?

时间:2013-04-03 13:59:41

标签: casting c++-cx reference-counting

如果我使用reinterpret_castIInspectable*转换为Object^,我仍然有责任发布原始IInspectable*吗?

显然,生成的Object^会在超出范围时自行释放,所以真正的问题是reinterpret_cast是否意味着AddRef是否为Object^提供了自己的引用计数,或者它需要我已经拥有的参考资料。

似乎有任何一种方法可以预期:一方面,COM操作永远不应该接管其输入指针的引用计数 - 另一方面,名称reinterpret_cast表明它只是< em>将我的位从“原始ABI指针”重新解释为“已经已经拥有对象的引用的阴影指针”,我的工作就是确保这是有意义的。

1 个答案:

答案 0 :(得分:3)

reinterpret_cast<Object^>(iinsp)调用本身没有与引用计数相关的副作用,但是,将该转换的结果分配给Object^变量将导致在对象指向的对象上发生addref。原始的IInspectable。当Object^变量超出范围或被赋值为null时,同样会在基础对象上调用Release()。是否导致对象超出范围将取决于它在整个业务之前的内部引用计数。例如:

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