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; }
结果如下: