c – static_cast可以将非空指针转换为空指针吗?

c – static_cast可以将非空指针转换为空指针吗?,第1张

概述我需要为回调函数编写代码(它将在ATL中调用,但这并不重要): HRESULT callback( void* myObjectVoid ){ if( myObjectVoid == 0 ) { return E_POINTER; } CMyClass* myObject = static_cast<CMyClass*>( myObjectVoid ); 我需要为回调函数编写代码(它将在ATL中调用,但这并不重要):
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可以更改指针值:
class A{ int x; }; class B{ int y; };class C : A,B {};C *c=new C(); B *b=c; // The B part comes after the A part in C. Pointer adjustedC *c2=static_cast<C*>(b); // Pointer gets adjusted back,points to the beginning of the C part

但是,“空指针值(4.10)被转换为空指针值目标类型.“(5.2.9-8),即如果c为NulL,则b也为NulL(并且未调整),因此c2设置为NulL.整个意思是:如果静态转换非NulL myObjectVoID产生NulL,那么myObjectVoID的值是通过以某种方式绕过类型系统获得的.这意味着,编译器可能会抛弃你的第二个检查,因为“它无论如何都不会发生”.

总结

以上是内存溢出为你收集整理的c – static_cast可以将非空指针转换为空指针吗?全部内容,希望文章能够帮你解决c – static_cast可以将非空指针转换为空指针吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/langs/1233075.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存