代码之家  ›  专栏  ›  技术社区  ›  Satbir

为什么我能够使用无效的类指针进行函数调用

  •  6
  • Satbir  · 技术社区  · 16 年前

    在下面的代码段中,虽然指针未初始化,但调用仍然成功

    temp *ptr;
    ptr->func2();
    

    是因为C++语言的属性,还是VC++ 6编译器的犯规?

    class temp {
    public:
        temp():a(9){}
        int& func1()
        {
            return a;
        }
        bool func2(int arg)
        {
            if(arg%2==0)
                return true;
            return false;
        }
        int a;
    };
    
    int main(int argc, char **argv)
    {
        temp *ptr;
        int a;
        cin>>a;
        if(ptr->func2(a))
        {
            cout<<"Good poniner"<<endl;
        }
        ptr->func1(); // Does not crash here
        int crashere=ptr->func1();// But does crash here 
        return 0;
    }
    
    6 回复  |  直到 15 年前
        1
  •  14
  •   RichieHindle    10 年前

    C++编译器不会阻止你使用未初始化的指针,尽管结果是不确定的,但是现实世界中的编译器生成代码却忽略了指针未初始化的事实是正常的。

    这是为什么C++相对于其他一些语言既快又比较危险的原因之一。

    你打电话来的原因是什么 func2 this 指针。指针值从未使用过,因此不会导致问题。在里面 func1 使用 指针(用于访问成员变量),这就是该变量崩溃的原因。

        2
  •  7
  •   sharptooth    16 年前

    召唤 func2() 成功,因为要调用的确切方法在编译时已知(调用不是虚拟的),并且方法本身不取消引用 没关系。

    ptr->func1(); // This works
    

    因为编译器被指示返回对类成员的引用。为此,它只需将成员的偏移量添加到 指针,这将生成另一个无效指针(引用,几乎相同)。

    int crashere=ptr->func1();// Crashes here
    

        3
  •  3
  •   MSalters    16 年前

    C++具有未定义行为的概念。使用未初始化的指针是此类未定义行为的常见示例。出于性能原因,C++标准位置 没有任何限制

        4
  •  0
  •   Preet Sangha    16 年前

    我怀疑 ptr->func2() 由于它总是返回真值,所以被优化了。但正如里奇所说,在这种情况下,指针的使用与你一样好;我们没有接触任何实例数据(a),因此没有什么可崩溃的。

        5
  •  0
  •   Andrew Keith    16 年前

    它不起作用。幸运的是,你的应用程序并没有在你期望它崩溃的地方崩溃。这不是编译器的一个特性,而是编译器的一个副作用,它使函数调用看起来可以工作。

        6
  •  0
  •   Sachin    16 年前

    您可以使用未初始化的指针调用这些方法。也行 ptr->func1(); 或 int crashere=ptr->func1()//

    推荐文章