当前位置: 首页 > article >正文

C++:指针:什么是野指针

野指针目录

  • 1:定义
  • 2:野指针常见情形
    • 2.1 :未初始化的野指针
    • 2.2 所指的对象已经消亡
    • 2.3 指针释放之后未置空
  • 3:避免野指针

1:定义

指向非法的内存地址的指针叫做野指针(Wild Pointer),也叫悬挂指针(Danging Pointer),意为无法正常使用的指针。

2:野指针常见情形

2.1 :未初始化的野指针

出现野指针最典型的情况就是在定义指针变量之后没有对它进行初始化,如下面的程序。

#include<iostream>
using namespace std;
int main(){
	int* p;
	// 编译通过,运行时出错 error : Segment fault 信号错误
	cout << *p << endl;
    return 0;
}

2.2 所指的对象已经消亡

指针指向某个对象之后,当这个对象的生命周期已经结束,对象已经消亡后,仍然使用该指针访问该对象,那么将会出现运行时错误。

#include<iostream>
using namesoace std;
int* retAddr()
{
	int num = 10;
	return &num;
}
int main()
{
	int* p = NULL;
	p = retAddr();
	cout << &p << endl;
	cout << *p << endl;
}

上面程序在编译在编译的时候,会报错
warning: address of local variable 'num' returned [-Wreturn-local-addr]
表示:函数内部定义的变量在函数结束时被释放掉,所以返回是找不到的。

2.3 指针释放之后未置空

  • 指针p被 free或者 delete之后,没有置为NULL,这就是让人误以为是一个合法指针p.
  • 对指针进行 free或者 delete只是把指针所指的空间释放掉,但并没有把指针本身置为空,此时指针指向的就是垃圾内存,所以释放后的指针应该立即置为NULL,防止产生野指针。
#include<iostream>
using namespace std;
int main()
{
	int* p = NULL;
	p = new int[10];
	delete p;
	cout << "p[0]:"<< p[0] << endl;
}

打印结果: p[0]:13511344
很显然打印结果是一个随机值,因为此时指针所指的空间是一个垃圾内存,存放着随机值。

3:避免野指针

综述所知
野指针有时比较隐蔽,编译器不能发现,为了防止野指针带来的危害,开发人员应该注意以下事项。

  1. C++引入了引用机制,如果使用引用可以达到编程目的,那么可以不用使用指针,因为引用在定义的时候, 必须初始化,这样可以避免野指针的出现
  2. 如果一定要是使用指针, 那么需要在定义指针的时候,同步进行初始化操作,定义时将其置为NULL或者指向一个有名的变量。
  3. 对指针进行 free或者delete操作后,将其设置为 NULL。对于使用 free情况,常常定义一个宏或者函数 xfree来代替free置空指针。
#define xfree(x)  free(x);  x = NULL;

http://www.kler.cn/a/3886.html

相关文章:

  • 剑指offer-旋转数组中的最小值
  • 软件测试风险管理需要做的3件事
  • 数据结构 | 泛型 | 擦除机制| 泛型的上界
  • 一次内存泄露排查
  • ROS Cartographer--Algorithm
  • 比肩ChatGPT的国产AI:文心一言——有话说
  • 单片机常用完整性校验算法
  • 【云原生|Docker】06-dokcerfile详解
  • 仓库管理系统有哪些作用?选择仓库管理系统要注意这4大问题!
  • 初识操作系统
  • Linux进程概念—环境变量
  • 【Spring事物三千问】TransactionSynchronizationManager的原理分析
  • 力扣-行程和用户
  • python redis连接池sub/pub断开连接问题
  • SparkSql编程开发
  • Proteus8.15安装包下载及安装教程
  • 【Python】在python中使用MySQL
  • Postgresql实战:使用pg_basebackup或pg_start_backup方式搭建Postgresql主从流复制
  • 代码随想录【Day42】动态规划 | 背包问题、416. 分割等和子集
  • 人工智能交互系统界面设计(Tkinter界面设计)