tengo que escribir código para una función de devolución de llamada (que se llamará desde el interior de ATL, pero eso no es realmente importante):¿Puede static_cast convertir un puntero no nulo en un puntero nulo?
HRESULT callback(void* myObjectVoid)
{
if(myObjectVoid == 0) {
return E_POINTER;
}
CMyClass* myObject = static_cast<CMyClass*>(myObjectVoid);
return myObject->CallMethod();
}
aquí la void*
se garantiza que sea un puntero a CMyClass
, por lo static_cast
es legal . Mi preocupación es que el código debe ser tan portátil (al menos hasta versiones más nuevas de Visual C++) como sea posible. Entonces, para ser súper paranoico, me inclino a comprobar también el puntero CMyClass*
, quiero decir, ¿y si resulta ser nulo?
if(myObjectVoid == 0) {
return E_POINTER;
}
CMyClass* myObject = static_cast<CMyClass*>(myObjectVoid);
if(myObject == 0) {
return E_POINTER;
}
¿El segundo control es razonable? ¿Es posible que static_cast
convierta un puntero no nulo en un puntero nulo?
¿Por qué no solo emitir incondicionalmente, y comprobar la nulidad después del reparto? static_cast no va a desreferenciar el puntero. –
@Logan Capaldo: Se siente mejor comprobar lo antes posible. – sharptooth