C++随笔-野指针

376 阅读1分钟

野指针

指向”垃圾“内存的指针称为野指针。

产生原因

  1. 指针变量没有初始化。
	int* a;
	*a = 123;

编译:

屏幕截图 2022-02-23 170419.jpg

  1. 已经不用的指针变量没有置为NULL。通常是使用delete或free后的指针没有被置为NULL。
  • 调用delete后未置为NULL。
	char* p = (char*)malloc(10);
	cout << p << endl;
	delete(p);
	cout << p << endl;

结果:

屏幕截图 2022-02-23 172105.jpg 最后问题回到了1,指针变量没有初始化。

  • 调用free后没有置为NULL。
	char* p = (char*)malloc(10);
	cout << p << endl;
	free(p);
	cout << p << endl;
	if (p != NULL) {
		cout << "野指针" << endl;
	}

编译:

free.jpg 调用free后,问题同样回到了问题1,指针变量没有初始化。通过编译会发现free后,只是前后输出的内容不同,说明释放的只是指针指向的内存,而指针本身并没有被释放,且使用p != NULL判空无效,说明指针指向无用的地方,也就成为了野指针。

  1. 指针的操作超出了变量的作用域。
	int* p;
	for (int i = 0; i < 2; ++i)
	{
		p = &i;
	}
	cout << i << endl;
	cout << *p << endl;

p在循环内被赋值,但i的作用域在循环内,但在循环外输出p时,i已经无效,所以此时虽然指针仍有指向,但指向的内容不存在了,所以指针的指向超出了i的作用域,属于垃圾内容。

如何避免

没有初始化、已经被释放的、超出作用域的统统置为NULL.。