我一直认为,在将空*转换到struct*之后检查指针是避免无效转换的有效方法。有点像
MyStructOne* pStructOne = (MyStructOne*)someVoidPointer;
if(!pStructOne)
return 0;情况似乎并非如此,因为我可以将相同的数据转换为两个不同的结构,并获得相同的有效地址。然后,该程序很乐意用任意随机数据填充我的struct字段。
什么是转换结构指针的安全方法?
我不能使用dynamic_cast<>,因为它不是类。
谢谢你的帮助!
发布于 2012-09-23 00:15:53
如果您对struct布局有任何控制,可以将您自己的类型枚举放在每个结构的前面,以验证该类型。这在C和C++中都是有效的。
如果不能使用枚举,因为并非所有类型都提前知道,则可以使用GUID。或指向每个结构唯一的静态变量或成员的指针。
发布于 2012-09-22 23:59:45
您可以在结构或类中使用dynamic_cast,只要它有一个虚拟方法。我建议您重新设计您的更广泛的系统,使其没有任何地方的void*。这是非常糟糕的做法/设计。
发布于 2012-09-23 00:07:36
一般说来,没有“安全的铸造方法”,因为铸造指针本身就是一个不安全的过程。强制转换说,您比类型系统更了解,所以在开始转换指针之后,您不能期望类型系统会有任何帮助。
在C++中,您不应该使用C风格的强制转换(如(T) x),而应该使用C++强制转换。现在,有几个简单的规则可以让您确定转换指针或引用是否可以:
const_cast并修改该对象,则必须确保该对象实际上是可变的。static_cast指针或引用,或者从指针到空指针。必须确保对象的动态类型是强制转换目标的子类型,或者在无效指针的情况下,指针是正确类型对象的地址。reinterpret_cast只应该用于或来自char *类型(可能是signed或unsigned),也不能用于将指针与(u)intptr_t之间的指针转换。在任何情况下,您都有责任确保所讨论的指针或引用到您在强制转换中声明的类型的对象。没有其他人可以为你做的检查来验证这一点。
https://stackoverflow.com/questions/12548619
复制相似问题