#include <iostream.h>class A 
{
public:      void Func(void)

cout << "Func of class A" << endl; 
}};
void Test(void)
{
A  *p; {
   A  a;    p = &a; // 注意 a 的生命期 } p->Func(); // p是"野指针"
}
void main( void )
{
Test();
}

解决方案 »

  1.   

    与a的生命期无关,你将    p = &a; 删掉,也可以运行void Test(void)
    {
    A  *p=NULL; {
       A  a;    //p = &a;
       
    } p->Func(); // p是"野指针"
    }这样也可出结果
      

  2.   

    {
        A a;
        p=&a;
    }
    这个代码块和:
    p=new A;
    是完全一样的。所以应该就是输入正确答案吧。
      

  3.   

    {
        A a;
        p=&a;
        delete a;
    }
    这样P才是野指针
      

  4.   

    与a生命期和编译器无关!到了
    p->Func(); // p是"野指针"
    时,a虽然是死了,但p还是没有死呀.
    除非你在此之前 delete p; 那就到
    p->Func(); // p是"野指针"
    这一行时就会出错了
      

  5.   

    a虽然是死了,但p还是没有死呀.因为你的p是在花括弧外就申请的
      

  6.   

    没有用到成员当然不会有事
    A里加个成员试试
    class A 
    {
    char buf[128];
    public:      void Func(void)

                      strcpy(buf,"test");
    cout << "Func of class A" <<buf<< endl; 
    }};
    ____________________p->Func()好比调用了
    A::Func();
      

  7.   

    你們都看清楚,
    {
       A  a;    p = &a; // 注意 a 的生命期}
    這段是在花括號裡面的.理論上走出去以後a就消失了.但是在vc裡面,a地址仍然存在.這不能說是編譯器bug.但是這是編譯器的運行機制造成的.
      

  8.   

    好像这个要看编译器,在vc里(vc6)应该是楼上几位说的对。
      

  9.   

    void Test(void)
    {
    A  *p; {
       A  a;    p = &a; // 注意 a 的生命期 } p->Func(); // p是"野指针"
    }
    这段代码里,a的内存是分配于堆栈上的,即程序最初进入函数时使用
    push ebp
    mov ebp,esp
    sub esp,(size)
    的方法来形成a的内存,然后调用A的构造函数对a进行初始化,而p也是堆栈变量,所以p=&a;的意思不过是把p的地址赋成堆栈的另一个地址,所以p当然会始终有效编译器控制的只是程序调用的方法,例如把上述代码改成:
    void Test(void)
    {
    A  *p; {
       A  a;    p = &a; // 注意 a 的生命期 }         a.Func();
    //p->Func(); // p是"野指针"
    }
    则肯定会编译不通过,所以生命周期只是针对调用该对象的使用范围,超出范围会调用对象的析构函数,但是释放内存和生命周期无太直接的联系!
      

  10.   

    呵呵,楼上的说得有道理。我再说一点,a在大括号之后肯定是析构了,不信可以给A加一个析构函数,确实是在Func执行之前被析构的。另外,野指针也并非就不能输出正确的结果,只是结果不确定而已。
      

  11.   

    roger_ding(海天一色) 说得有道理Quinn(稻草人)
    因为已经有指针指向那快内存了。
    ----------------------------------------
    呵呵,C++还没有这么智能吧。
      

  12.   

    成员函数的调用和成员变量的引用是不一样的,如果这样:
    A* p;
    p->func();
    也是不会错的,因为非virtual成员函数的调用是早捆绑,也即编译时就决定了调用地址,而函数里又没有对成员变量的引用,所以“幸运的存活”下来了。
      

  13.   

    去看看深度搜索C++ 对象模型吧
    A* p = NULL;
    p->Func();
    也照样可以运行我的帖子里也有过这样的讨论
    http://community.csdn.net/Expert/topic/2878/2878307.xml?temp=.6796839