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嘛,就随便了。
------解决方案--------------------
你把那对大括号里面的东西换成一个函数就会有问题了
原因是括号作用域不会有栈上的操作,其内存状态不会变化
而换成函数调用的话有了进出栈的操作,内存状态(地址)也会变化
指针操作超越了变量的作用范围。示例程序如下:
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嘛,就随便了。
------解决方案--------------------
你把那对大括号里面的东西换成一个函数就会有问题了
原因是括号作用域不会有栈上的操作,其内存状态不会变化
而换成函数调用的话有了进出栈的操作,内存状态(地址)也会变化