我想要一个巧妙的接口指针类的原因是要自动地添加和释放接口指针。
使用组件对象模型(COM)接口指针时,你必须要遵循几条规则。首先,绝不要在一个接口指针上调用删除(delete)来代替Release。下面的代码是不正确的:
IDraw* pIDraw ; CoCreateInstance(...,IID,_IDraw, (void**)&pIDraw) ; pIDraw->Draw(0,0,100,100) ; delete pIDraw ; // Don't delete an interface pointer. |
下面的代码是正确的:
IDraw* pIDraw ; CoCreateInstance(...,IID,_IDraw, (void**)&pIDraw) ; pIDraw->Draw(0,0,100,100) ; pIDraw->Release() ; |
C++程序设计员通常delete一个对象指针。因为这个原因,C++程序员容易忘记并且在一个接口指针上用delete代替Release。它也是C++程序员很难发现的一个错误,因为删除指针太自然了。
第二条规则是在创建新的指针时调用AddRef 。下面的代码是不正确的:
IDraw* pIDraw ; CoCreateInstance(...,IID,_IDraw, (void**)&pIDraw) ; pIDraw->Draw(0,0,100,100) ; delete pIDraw ; // Don't delete an interface pointer. |
下面的代码是正确的:
IDraw* pIDraw ; CoCreateInstance(...,IID,_IDraw, (void**)&pIDraw) ; pIDraw->Draw(0,0,100,100) ; pIDraw->Release() ; |
上面的例子很小,但是,在复杂的代码中,这个错误是很难跟踪到的。
使用巧妙的接口指针类并不只有唯一一个原因。DonBox在C++报道中提到了其他的一些原因(请参阅本篇文章末尾的书目)。