意外的输出而不是运行时错误

pap*_*ane 0 c++

对于谁知道背景魔法可能是显而易见的,但我无法理解下面的代码如何提供正确的输出.我预计运行时错误.请帮忙.

class a
{
  public:
    void print()
    {
        cout<<"Hello\n"<<endl;
        int d = 100;
        cout<<d<<endl;
    }

    int val;
};


int main()
{
   a* ptr;

   ptr->print();

   return SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

输出如下:

Hello

100
Run Code Online (Sandbox Code Playgroud)

mya*_*aut 5

没有魔法 - 你的代码有不确定的行为.在你的代码不访问ptr其隐式传递给print()this指针,这就是为什么没有错误发生.

在其他几种情况下可能会发生:

  • 访问a实例的字段.它将需要读取*(this + field_offset)将导致运行时错误的内存.

  • 访问虚拟方法.我知道的实现使用vtable来做这件事,它通常作为第一个指针存储在对象空间中,因此指向vtable的指针 与此相同,因此:vtable = *this

  • 其他情况,取决于编译器和平台

注意:示例中省略了类型转换 this