如果我使用reinterpret_cast
从IInspectable*
转换为Object^
,我仍然有责任发布原始IInspectable*
吗?
显然,生成的Object^
会在超出范围时自行释放,所以真正的问题是reinterpret_cast是否意味着AddRef是否为Object^
提供了自己的引用计数,或者它需要我已经拥有的参考资料。
似乎有任何一种方法可以预期:一方面,COM操作永远不应该接管其输入指针的引用计数 - 另一方面,名称reinterpret_cast
表明它只是< em>将我的位从“原始ABI指针”重新解释为“已经已经拥有对象的引用的阴影指针”,我的工作就是确保这是有意义的。
答案 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