这个C ++代码如何工作?未初始化的指针

时间:2012-10-18 07:31:53

标签: c++

  

可能重复:
  What will happen when I call a member function on a NULL object pointer?

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;
}

我调用了SomeFunction()而没有初始化“a”,它仍然正确打印“工作”。我不明白为什么,应该用分段故障拯救它!

3 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:5)

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

鉴于您的foo()方法从不引用任何数据成员,它永远不需要使用它,因此尽管没有初始值,但运行正常。

答案 2 :(得分:3)

从语义上讲,

o.f(args)

相同
f(o, args)

因此,您可以将要调用的函数(A::foo())视为等同于:

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

如您所见,pthis永远不会被解除引用,因此不会发生无效的内存访问。即使您键入this->foo(),它也是完全相同的调用,并且this不需要取消引用。

至少,这是编译器实现它的一种常见方式。对于可能发生的事情,它是未定义的,因此在Death Station 9000上运行代码可能会将小猫射入太空。想想小猫!