野指针 与指针参数传递内存

一、杜绝“野指针”
“野指针”不是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);//释放内存
}

你可能感兴趣的:(C++,内存管理)