代码改变世界

C++ 野指针

2013-09-24 16:17  Keiven_LY  阅读(817)  评论(0编辑  收藏  举报

看下面一段代码:

if(条件)

     int *p=new int[8];

}

p是代码块中声明的局部指针变量,在代码块执行完退出时,p自动消亡,但p指向的大小为8,类型为整形的内存空间并不会被释放掉。

代码块退出后,程序无法再通过指针p释放所申请的动态内存,这块内存已经“泄漏”!

防止内存泄漏的方法:适时释放申请的动态内存  malloc()与free()配对使用,new与delete配对使用

 

再看

    int *p=new int[8];

         .........

   delete[] p;

执行完 delete[] p后,指针p也不会消亡,其值也不会变,并不会变为null,因此,指针被free或delete后,一定要置为null,没有置为null的指针称为“野指针”。

 

看下面的一段程序:

#include<iostream>
#include<stdlib.h>

using namespace std;

char *GetStr()
{
    char sz[]="Hello World";  
    return sz;
}

int main()
{
    char *p=GetStr();//返回字符数组的首地址给p
    cout<<p<<endl;
    system("pause");
    r

编译通过,但输出的结果不是“Hello World”,而是乱码
原因在于:字符数组sz是在函数GetStr()的内部创建的,函数执行完,其对应的内存区域会被撤销,main函数中p的初始化就变得没有意义,实际上p并没有指向合法的内存空间,造成输出错误。

   即当前代码块执行完毕后,代码块中的临时变量(包括函数调用时的参数)都自动消亡,其占用的内存空间也被内存管理器收回。此时,指向这些临时变量的指针就变得没有意义。

再看下面一段程序:

#include<iostream>
#include<stdlib.h>

using namespace std;

char *GetStr()
{
    char sz[]="Hello World";  
    return sz;
}

int main()
{
    char *p=GetStr();//返回字符数组的首地址给p
    cout<<p<<endl;

    char szz[]="Welcome C++";
    char *q;
    q=szz;
    cout<<q<<endl;

    system("pause");
    return 0;
}

结果如下: