19.8.5 保护引用计数
你可能已经注意到,interface_cast_noaddref返回的"指向用户请求的接口的指针"类型为protected_pointer_type。这是被用来防止客户端代码对一个接口的AddRef()或Release()进行"病态的"调用的。由于该强制会负责管理相应接口的生命期,所以客户代码不用越俎代庖。protected_pointer_type是基于protect_refcount模板来定义的, 后者看起来像这样:
程序清单19.18
- template <typename I>
- interface protect_refcount
- : public I
- {
- private:
- STDMETHOD_(ULONG, AddRef)()
- {
- I *pi = static_cast<I*>(this);
- return pi->AddRef();
- }
- STDMETHOD_(ULONG, Release)()
- {
- I *pi = static_cast<I*>(this);
- return pi->Release();
- }
- };
protect_refcount中的两个方法对于interface_cast_noaddref的客户代码来说是不可访问的,而其他接口相关的方法则仍然可以访问。- interface_cast_noaddref<IX>(py)->Release(); // 编译错误!