мне нужно написать код для функции обратного вызова (она будет вызываться из АТЛ, но это не очень важно):Может static_cast превратить ненулевой указатель в нулевой указатель?
HRESULT callback(void* myObjectVoid)
{
if(myObjectVoid == 0) {
return E_POINTER;
}
CMyClass* myObject = static_cast<CMyClass*>(myObjectVoid);
return myObject->CallMethod();
}
здесь void*
гарантированно будет указателем на CMyClass
, так static_cast
является законным , Меня беспокоит, что код должен быть как можно более переносимым (до более поздних версий Visual C++). Поэтому, чтобы быть суперпараноиком, я тоже хочу проверить указатель CMyClass*
- я имею в виду, что, если он окажется нулевым?
if(myObjectVoid == 0) {
return E_POINTER;
}
CMyClass* myObject = static_cast<CMyClass*>(myObjectVoid);
if(myObject == 0) {
return E_POINTER;
}
Является ли вторая проверка разумной? Возможно ли, чтобы static_cast
превратил ненулевой указатель в нулевой указатель?
Почему бы просто не бросить безоговорочно и проверить нуль после трансляции? static_cast не собирается разыменовывать указатель. –
@Logan Capaldo: Лучше проверить как можно раньше. – sharptooth