一、杜绝“野指针”
“野指针”不是NULL指针,只指向“垃圾”内存的指针。
对于NULL指针,if语句容易判断,能避免错误;
但野指针,if语句对它不起作用。
“野指针”的成因主要有两种:
(1)指针变量没有被初始化。
解决办法:创建指针的同时对其初始化,要么将指针设置为NULL,要么让它指向合法的内存;
char *p = NULL;
char *str = (char *)malloc(100);
(2)free或者delete释放内存后的指针没有赋值为NULL
char *p = (char*)malloc(100);
strcpy(p , "hello");
free(p); //p所指向的内存被释放,但p所指向的地址没有变,产生野指针
//p = NULL;消除风险
if(p != NULL)
{
strcpy(p,"world");//出错,p指向了无效的内存
}
(3)指针操作超越了变量的作用范围。
二.指针参数如何传递内存?
1.错误的例子
void GetMemory(char *p, int num)
{
p = (char*)malloc(sizeof(char)*num);
}
void Test(void)
{
char *str = NULL;
GetMemory(str,100); //str依然为NULL;
strcpy(str, "hello");//运行错误
//程序每运行一次GetMemory就会泄露一块内存
}
2.正确例子1: 二级指针进行指针参数申请内存
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(sizeof(char)* num);
}
void Test2(void)
{
char *str = NULL;
GetMemory2(&p,100);
strcpy(str,"hello");
cout << str <<endl;
free(str);
}
3.正确例子2:函数返回值来传递动态内存(堆内存)
char *GetMemory3( int num)
{
char *p = (char *)malloc(sizeof(char)* num);//堆内存
return p;//返回指向堆内存的指针
}
void Test3(void)
{
char *str = NULL;//初始化
str = GetMemory3(100);//分配内存
strcpy(str,"hello");//运用
cout << str <<endl;
free(str);//释放内存
}