3种指针

来源:互联网 发布:win10软件小助手 编辑:程序博客网 时间:2024/06/16 00:29

1.野指针:

未初始化的指针,指向一个已删除的对象或未申请访问受限内存区域的指针。与空指针不同,野指针无法通过简单地判断是否为 NULL避免,而只能通过养成良好的编程习惯来尽力减少。对野指针进行操作很容易造成程序错误。


野指针主要是因为这些疏忽而出现的删除或申请访问受限内存区域的指针。


一.指针变量未初始化
任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。


二.指针释放后之后未置空
有时指针在free或delete后未赋值 NULL,便会使人以为是合法的。别看free和delete的名字(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。此时指针指向的就是"垃圾"内存。释放后的指针应立即将指针置为NULL,防止产生"野指针"。


三.指针操作超越变量作用域
不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。

规避
在养成这些习惯的情况下,野指针的危害是可以降低的:
一.初始化时置NULL
指针变量一定要初始化为NULL,因为任何指针变量(除了static修饰的指针变量)刚被创建时不会自动成为NULL指针,它的缺省值是随机的。


二.释放时置NULL
当指针p指向的内存空间释放时,没有设置指针p的值为NULL。delete和free只是把内存空间释放了,但是并没有将指针p的值赋为NULL。通常判断一个指针是否合法,都是使用if语句测试该指针是否为NULL。例如:
对于使用 free 的情况,常常定义一个宏或者函数 xfree 来代替 free 置空指针:
所以动态分配内存后,如果使用完这个动态分配的内存空间后,必须习惯性地使用delete操作符取释放它。


2.悬空指针:

一个指针的指向对象已被删除,那么就成了悬空指针。

例如:
int main(){
char *dp = NULL;
for(i=0;i<1;i++) 

{
char c;
dp =&c;
}
/* 注意c的声明周期 */
/* dp 此时为悬空指针 */
}
这里for循环只是说明c是局部变量
void f(){
char *dp;
/* dp 未初始化,是野指针 */
}
有时也把野指针和悬空指针通称悬空指针


3.失效指针:??