c++野指针有关问题

c++野指针问题

指针操作超越了变量的作用范围。示例程序如下:  
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是“野指针”  
}  

函数Test在执行语句p-> Func()时,对象a已经消失,而p是指向a的,所以p就成了“野指针”。  

请问对象a怎么消失了?为什么会消失?a   的生命期   是多少?怎么判断他的生命期?
问题补充:我在我机器上作了一个实验,没有用类去试验,结果发现没什么问题:  
我的程序如下:  

#include   <iostream>  
using   namespace   std;  

int   main()  
{  
int   *p;  
{  
int   i   =   1;  
p   =   &i;  
}  
cout < <   *p   < <   endl;  

return   0;  
}  

输出结果还是   1,按理说   i   已经消失了才对的啊?

------解决方案--------------------
请问对象a怎么消失了?为什么会消失?a 的生命期 是多少?怎么判断他的生命期?
=====================================
指系统不维护
a的数据完整性了,a占据的那块内存,可能值未变化
是因为其他程序未使用
void Test(void)
{
A *p;
{
A a;
p = &a; // 注意 a 的生命期
} //这里a结束
p-> Func(); // p是“野指针”
}
------解决方案--------------------
输出结果还是 1,按理说 i 已经消失了才对的啊?
===========================================
注意,
i 的生命期结束,
只是说 i 本身不存在了,
但是它曾经使用的内存空间还是在的,(内存本身还是在)
在该内存数据没有被改写的时候,
这个空间的值还是 原来的值。

所以,
i 没有了,
但是之前的 i 所使用的空间中,
还是保留了原来的数据值 1
------解决方案--------------------
在安全级别为B级的操作系统上,i消亡的时候内存会被清0。windows嘛,就随便了。
------解决方案--------------------
你把那对大括号里面的东西换成一个函数就会有问题了
原因是括号作用域不会有栈上的操作,其内存状态不会变化
而换成函数调用的话有了进出栈的操作,内存状态(地址)也会变化