理解reinterpret_cast

3

下面的程序可以正常运行,即使类 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;
}

7
未定义行为包括看起来能够正常工作。 FYI: https://zh.cppreference.com/w/cpp/language/ub - Richard Critten
1
reinterpret_cast 基本上意味着:闭嘴编译器,我知道自己在做什么,只需将此类型视为另一种类型处理,我会接受后果。在大多数情况下,使用 reinterpret_cast 可能是一个错误。有一些情况下,您必须强制编译器并颠覆类型系统,但这些情况很少见。而且,您可以以明确定义的方式执行此操作的情况更少。重新解释转换除了“您可以将 foo 转换为 bar(如果 bar 足够大),然后可以将 bar 转换回 foo”之外,并没有给您太多保证。 - Jesper Juhl
允许使用reinterpret_cast的情况相当有限(请参见此处)。我只遇到过一次认为需要它的情况,结果证明我是错误的(既不需要它,也不能用于我使用的目的)。 - 463035818_is_not_a_number
3个回答

5

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

以下程序可以正常运行,

看起来没有问题的程序实际上是未定义行为的一个例子。


1
你的代码调用了未定义行为 (UB),这意味着它可能按照你的期望工作(例如,在你的计算机上,今天),但是不能保证
你是正确的,这段代码是不正确的,你只是(不)幸运,它“在你的计算机上工作”!

吹毛求疵:程序没有格式错误。根据[defns.well.formed],该程序是格式良好的,因为它是按照语法规则、可诊断的语义规则和单一定义规则构建的C++程序。根据[defns.ill.formed],该程序不是格式错误的,因为它是格式良好的。 - L. F.
@L.F. 当我写这个的时候感觉不太对,谢谢你指出来,已经编辑了回答! - gsamaras

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接