C++ C++;:将整数强制转换为指针的安全方法
我需要将包含地址的整数类型转换为实际的指针类型。我可以使用reinterpret_cast,如下所示:C++ C++;:将整数强制转换为指针的安全方法,c++,casting,dynamic-cast,reinterpret-cast,C++,Casting,Dynamic Cast,Reinterpret Cast,我需要将包含地址的整数类型转换为实际的指针类型。我可以使用reinterpret_cast,如下所示: MyClass *mc1 = reinterpret_cast<MyClass*>(the_integer); MyClass*mc1=重新解释\u转换(整数); 但是,这不会执行任何运行时检查,以查看所讨论的地址是否实际包含MyClass对象。我想知道首先转换为void*(使用reinterpret_cast),然后对结果使用dynamic_cast是否有任何好处。像这样:
MyClass *mc1 = reinterpret_cast<MyClass*>(the_integer);
MyClass*mc1=重新解释\u转换(整数);
但是,这不会执行任何运行时检查,以查看所讨论的地址是否实际包含MyClass对象。我想知道首先转换为void*(使用reinterpret_cast),然后对结果使用dynamic_cast是否有任何好处。像这样:
void *p = reinterpret_cast<void*>(the_integer);
MyClass *mc1 = dynamic_cast<MyClass*>(p);
assert(mc1 != NULL);
void*p=reinterpret\u cast(整数);
MyClass*mc1=动态投影(p);
断言(mc1!=NULL);
使用第二种方法有什么好处吗?没有,这样做没有什么特别的好处。一旦你使用
重新解释施法
,所有赌注都将被取消。由您来确定演员阵容是否有效。不,这样做没有什么特别的好处。一旦你使用重新解释施法
,所有赌注都将被取消。由你来确定演员阵容是否有效。实际上没有什么大的优势。如果void*指向的对象不是多态对象的指针,那么您会立即遇到未定义的行为(通常是访问冲突)。实际上没有什么大的好处。如果void*指向的对象不是指向多态对象的指针,您会立即遇到未定义的行为(通常是访问冲突)。安全的方法是保留所有活动MyClass对象的记录。最好将此记录保存在std::set
中,这意味着您可以轻松地添加、删除和测试元素
将它们存储为
void*
s的原因是,您不会像从整数创建未对齐的MyClass*
指针那样冒着不友好的风险。安全的方法是保留所有活动MyClass对象的记录。最好将此记录保存在std::set
中,这意味着您可以轻松地添加、删除和测试元素
存储它们为<代码> Value*/Cult>s的原因是,您不冒Nasyyess的风险,如创建未对齐的<代码> MyCux*<代码>指针,从不同的C++实现中,不同的方式实现了< <代码>动态DyjixCase<代码>。如果您想知道具体实现的答案,您应该提到您正在使用的实现。回答这个问题的唯一方法是参考ISO标准C++。 根据我对该标准的理解,在无效指针上调用
dynamic\u cast
是非法的:
dynamic_cast<T>(v)
这种情况下,<>代码>动态C++ > /COD>总是成功的,并且是由代码> v指向的最大派生对象的指针。如果您想知道具体实现的答案,您应该提到您正在使用的实现。回答这个问题的唯一方法是参考ISO标准C++。 根据我对该标准的理解,在无效指针上调用
dynamic\u cast
是非法的:
dynamic_cast<T>(v)
在这种情况下,dynamic_cast
始终成功,结果值是指向v
- 首先,“重新解释”
到int
是个坏主意。如果void*
为4,而sizeof(int)
为8(64x系统),则格式不正确sizeof(void*)
- 此外,
仅对多态类有效dynamic_cast
- 首先,“重新解释”
到int
是个坏主意。如果void*
为4,而sizeof(int)
为8(64x系统),则格式不正确sizeof(void*)
- 此外,
仅对多态类有效dynamic_cast
整数
指向一个已知的基类(至少有一个虚拟成员),那么实际上可能有一个优势:知道对象是特定的派生类。但是您必须首先对基类重新解释\u cast,然后执行动态\u cast
:
BaseClass* obj = reinterpret_cast<BaseClass*>(the_integer);
MyClass* myObj = dynamic_cast<BaseClass*>(obj);
BaseClass*obj=reinterpret\u cast(整数);
MyClass*myObj=动态投影(obj);
在dynamic\u cast
中使用void*
是没有用的,而且完全是错误的。不能使用dynamic\u cast
检查内存中的任意位置是否存在有效对象
在非指针型变量中存储地址时,还应注意。有些架构的sizeof(void*)!=sizeof(int),例如LP64。如果您确信
整数
指向已知的基类(至少有一个虚拟成员),那么实际上可能有一个优势:知道对象是特定的派生类。但是您必须首先对基类重新解释\u cast,然后执行动态\u cast
:
BaseClass* obj = reinterpret_cast<BaseClass*>(the_integer);
MyClass* myObj = dynamic_cast<BaseClass*>(obj);
BaseClass*obj=reinterpret\u cast(整数);
MyClass*myObj=动态投影(obj);
在dynamic\u cast
中使用void*
是没有用的,而且完全是错误的。不能使用dynamic\u cast
检查内存中的任意位置是否存在有效对象
在非指针型变量中存储地址时,还应注意。有些架构的sizeof(void*)!=sizeof(int),例如LP64。选项1是您唯一的(半)便携/有效选项
选项> 2:作为动态的C++(作为空隙是不允许的)无效C++。
在实现级别,它需要源类型的类型信息才能到达目标类型。无法(或者可能无法)从void*获取运行时源类型信息,因此这也是无效的
Dynamic_Cast用于在类型层次结构上下进行cas,而不是从未知类型进行cas
作为旁注,你应该