此C 代码如何工作?非初始化的指针

How does this C++ code work? Uninitialized Pointer

本文关键字:初始化 指针 工作 代码 何工作      更新时间:2023-10-16

可能的重复:
当我在空对象指针上调用成员函数时会发生什么?

class A {
  public:
    void foo() { cout << "Work";}
    void bar() { this->foo(); }//new edit, works too!
};
class B {
  private:
    A *a; //never initialized
  public:
    A& getA() {
      return *a;
    }
};
void SomeFunction() {
    B *b = new B();
    B& bRef = *b;
    bRef.getA().bar();//edited
    delete b;
}

我在没有初始化" A"的情况下调用了somefunction(),并且它仍然正确打印"工作"。我不明白为什么,它应该以细分故障的方式保释!

这是未定义的行为,但是它对大多数编译器都可以使用,因为foo不是virtual,并且不使用this指针。

请记住,类只是C 的构造。编译时,所有类方法只是接受隐藏的this参数的静态方法。

鉴于您的foo()方法永远不会引用任何数据成员,因此它不需要使用它,因此尽管有非直接的价值,因此运行良好。

语义上,

o.f(args)

相同
f(o, args)

因此,您可以考虑要调用的功能(A::foo())等效于:

void A_foo(A* pthis)
{
    cout << "Work";
}

您可以看到,pthis永远不会被删除,因此不会发生无效的内存访问。即使您键入this->foo(),它也是完全相同的调用,并且this也不需要被删除。

至少,这是编译器实施它的一种常见方法。确切地说,这是不确定的,因此在死亡站9000上运行代码可能会将小猫带入太空。想想小猫!