林锐的《高质量C++/C编程指南》中的一个例子
#include <iostream>
using namespace std;
class A
{
public :
void Func(void){cout << "Func of class A/n/n";}
};
void Test(void)
{
A *p;
{
A a;
p = &a;
}
p->Func();
}
int main(void)
{
Test();
return 0;
}
执行p->Func()时,对象a已消失,而p是指向a的,所以就成了野指针
但奇怪的是作者在运行是没有出错,说可能是与编译器有关
我添加了一个整型指针,自己测试了一下:
#include <iostream>
using namespace std;
class A
{
public :
void Func(void){cout << "Func of class A/n/n";}
};
void Test(void)
{
A *p;
int *pi;
{
A a;
p = &a;
int ii = 90;
pi = ⅈ
}
p->Func();
cout << "*pi = " << *pi << endl;
}
int main(void)
{
Test();
return 0;
}
我运行的时候也没有出错
后面添加的整数指针的测试也没有错
但是我试着把变量声明和变量赋值的过程提出来后,A指针没有错,整型指针却出错了:
#include <iostream>
using namespace std;
class A
{
public :
void Func(void){cout << "Func of class A/n/n";}
};
A *p;
int *pi;
void forTest(void)
{
A a;
p = &a;
int ii = 90;
pi = ⅈ
}
void Test(void)
{
forTest();
p->Func();
cout << "*pi = " << *pi << endl;
}
int main(void)
{
Test();
return 0;
}
指针指向的内容超出作用域范围,或是指针被释放之后,究竟会产生怎样的操作呢,“内容消失”代表什么?
是用其他的内容填充呢?还是内容不变,空间留着以后用。
野指针与作用域陷阱
本文通过几个C++示例探讨了野指针的概念及其潜在的问题,特别是当指针指向的对象超出其作用域后的行为。文章展示了不同情况下程序的表现,并讨论了可能的原因。
16万+

被折叠的 条评论
为什么被折叠?



