【问题标题】:Understanding reinterpret_cast了解 reinterpret_cast
【发布时间】:2019-11-15 10:54:36
【问题描述】:

即使B 类分配的内存不足以容纳A 类的所有成员,以下程序也可以正常运行。

// CPP code to illustrate the pointer reinterpret
#include <iostream>
using namespace std;

class A {
public:
    void fun_a()
    {
        cout << " In class A\n";
    }
    int Val;
    int Res;
};

class B {

};

int main()
{
    // creating object of class B
    B* x = new B();

    A* new_a = reinterpret_cast<A*>(x);

    // accessing the function of class A
    new_a->fun_a();
    new_a->Val = 10;
    new_a->Res = 20;

    cout << new_a->Val;
    cout << new_a->Res;

    return 0;
}

【问题讨论】:

  • 未定义行为包括看似有效。仅供参考:en.cppreference.com/w/cpp/language/ub
  • reinterpret_cast 基本上是指;只是闭嘴编译器,我知道我在做什么,只要把这种类型当作另一种类型,我会接受后果。在大多数 情况下,使用reinterpret_cast 可能是一个错误。在某些情况下,您必须像这样强制编译器并颠覆类型系统,但它们很少见。你可以以明确的方式做到这一点的情况更少。除了“您可以将 foo 转换为 bar - 如果 bar 足够大 - 然后您可以将 bar 转换回 foo”之外,重新解释转换并没有给您很多保证。
  • 允许reinterpret_cast 的情况相当有限(参见here)。只有一次我遇到了一个我认为我需要它的情况,结果证明我错了(无论是在我不需要它的意义上,还是在我使用它的意义上它是不允许的)

标签: c++ operator-keyword reinterpret-cast


【解决方案1】:

您的代码调用 Undefined Behavior (UB),这意味着它可以按您的预期工作(例如,在您的计算机上,今天),但 不是保证。

您是正确的,此代码不正确,您只是(不)幸运它“在您的计算机上工作”!

【讨论】:

  • 吹毛求疵:程序不是格式错误的。根据[defns.well.formed],该程序是结构良好的,因为它是根据语法规则、可诊断语义规则和单定义规则构造的 C++ 程序。根据[defns.ill.formed],该程序不是格式错误的,因为它格式正确。
  • @L.F.写的时候感觉不对,谢谢指出,答案已编辑!
【解决方案2】:

这是未定义的行为。当我们知道它是安全的时,我们应该使用 reinterpret_cast。 例如,您想使用套接字编程发送对象。在那里,Api 将数据作为字符缓冲区,因此您可以将其用作 A* new_a = 新 A(); char* new_Data = reinterpret_cast(new_a); 在接收端,您必须使用 reinterpret_cast 使用反转操作,但这次是从 char * 到 A* ; 这是您知道安全的一种情况。

【讨论】:

    【解决方案3】:

    通过指向T 的指针间接指向不指向T(或兼容类型)类型的对象会导致未定义的行为。

    以下程序运行没有任何问题,

    程序运行似乎没有任何问题是未定义行为的一个示例。

    【讨论】:

      猜你喜欢
      • 2011-06-12
      • 2011-06-17
      • 2011-06-10
      • 1970-01-01
      • 2012-12-25
      • 2016-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多