C++ C++;:将整数强制转换为指针的安全方法

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是否有任何好处。像这样:

我需要将包含地址的整数类型转换为实际的指针类型。我可以使用reinterpret_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*
    是个坏主意。如果
    sizeof(int)
    为4,而
    sizeof(void*)
    为8(64x系统),则格式不正确

  • 此外,
    dynamic_cast
    仅对多态类有效

      • 首先,“重新解释”
        int
        void*
        是个坏主意。如果
        sizeof(int)
        为4,而
        sizeof(void*)
        为8(64x系统),则格式不正确

      • 此外,
        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

      作为旁注,你应该