19.8.5 保护引用计数

2013-10-07 15:07:03 · 作者: · 浏览: 76

19.8.5  保护引用计数

你可能已经注意到,interface_cast_noaddref返回的"指向用户请求的接口的指针"类型为protected_pointer_type。这是被用来防止客户端代码对一个接口的AddRef()或Release()进行"病态的"调用的。由于该强制会负责管理相应接口的生命期,所以客户代码不用越俎代庖。protected_pointer_type是基于protect_refcount模板来定义的, 后者看起来像这样:

程序清单19.18

  1. template <typename I> 
  2. interface protect_refcount  
  3.     : public I  
  4. {  
  5. private:  
  6.   STDMETHOD_(ULONG, AddRef)()  
  7.   {  
  8.     I   *pi = static_cast<I*>(this);  
  9.     return pi->AddRef();  
  10.   }  
  11.   STDMETHOD_(ULONG, Release)()  
  12.   {  
  13.     I   *pi = static_cast<I*>(this);  
  14.     return pi->Release();  
  15.   }  
  16. };  

protect_refcount中的两个方法对于interface_cast_noaddref的客户代码来说是不可访问的,而其他接口相关的方法则仍然可以访问。
  1. interface_cast_noaddref<IX>(py)->Release(); // 编译错误!