我有一个带有返回对象的方法的 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
所以我可以选择任何一种方式。
IMO 第一个变体更清晰——所有引用计数的东西都在一段代码中。我监督了什么?为什么第二种方法会更好?以上哪个更好,为什么?