我有一个COM接口,其中包含一个返回对象的方法:
interface ICreatorInterface {
HRESULT CreateObject( IObjectToCreate** );
};
关键在于调用
ICreatorInterface::CreateObject()
是检索实现 IObjectToCreate
接口的对象的唯一方式。
在 C++ 中,我可以这样做:
HRESULT CCreatorInterfaceImpl::CreateObject( IObjectToCreate** result )
{
//CObjectToCreateImpl constructor sets reference count to 0
CObjectToCreateImpl* newObject = new CObjectToCreateImpl();
HRESULT hr = newObject->QueryInterface( __uuidof(IObjectToCreate), (void**)result );
if( FAILED(hr) ) {
delete newObject;
}
return hr;
}
或者这样
HRESULT CCreatorInterfaceImpl::CreateObject( IObjectToCreate** result )
{
//CObjectToCreateImpl constructor sets reference count to 1
CObjectToCreateImpl* newObject = new CObjectToCreateImpl();
HRESULT hr = newObject->QueryInterface( __uuidof(IObjectToCreate), (void**)result );
// if QI() failed reference count is still 1 so this will delete the object
newObject->Release();
return hr;
}
不同之处在于引用计数器的初始化方式以及在QueryInterface()
失败的情况下对象删除的实现方式。由于我完全控制CCreatorInterfaceImpl
和CObjectToCreateImpl
,所以我可以选择其中任何一种方式。
在我看来,第一种变体更清晰 - 所有引用计数相关的内容都在一个代码块中。我有没有忽略什么?为什么第二种方法可能更好?上述哪种方法更好,为什么?