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

野指针和悬空指针详解

野指针

野指针是指没有被初始化或指向未知、随机内存区域的指针。这种指针从未指向一个合法的内存地址,因此是完全不可预测的,可能指向任意地址。

出现情形

未初始化的指针:声明指针变量但未赋值,使其指向随机地址。

非法的指针运算:指针算术操作导致越界,指针指向无效区域。

int* p;   //野指针 未初始化
int arr[5];
int* p1=arr+10;// 野指针 指向未知的内存

悬空指针

悬空指针是指向已被释放或超出作用域的内存区域的指针。此类指针原本指向有效的内存或对象,但当该内存被释放或对象生命周期结束后,指针依然指向这块无效的内存区域。

出现情形

指向内存被释放:指针被free或者delete后未及时置空

delete或者free是释放指针指向内存  指针本身并未被处理

int* p=new int(10);
cout<<p<<endl;
delete p;
cout<<p<<endl;     /*delete后应该及时置空*/

可以看到虽然delete后指针对象仍然存在,但是指针已经失效,内存已被释放

指向已销毁的局部变量:函数内部的局部变量地址在函数返回后被销毁,指向它的指针就成为悬空指针 

int* test()
{
    int temp=10;  
    return &temp;
}

int*p =test();      //虽然返回了一个指针,但是这个指针已经失效因为 脱离作用域外对象销毁内存释放
#include <iostream>
using namespace std;

int main() {
	int *p;
	{
		int a = 10; 
		p = &a;        //a脱离作用域销毁内存释放
	}
	cout << p << endl;  //p虽然有值但是指针已经失效
	return 0;
}

悬空指针危害

1. 未定义行为

  • 使用悬空指针访问或修改数据会导致未定义行为。因为指向的内存已经被释放,系统可能将该内存分配给其他对象或进程,导致不可预测的错误,包括数据篡改、程序崩溃等。

2. 程序崩溃

  • 访问悬空指针可能导致程序试图访问无效的内存区域,从而触发操作系统的保护机制,导致程序崩溃。这种崩溃有时表现为段错误(Segmentation Fault)。

3. 数据损坏

  • 如果悬空指针指向的内存被重新分配给其他变量或对象,程序可能无意中修改这些新的数据,导致数据污染或数据损坏。这类错误难以追踪和调试,因为它们可能表现为数据的异常变化,而并非立即崩溃。

4. 内存泄漏

  • 当悬空指针存在时,程序员可能会误以为该指针仍然指向有效的内存,从而导致重复释放。重复释放一个已经被释放的内存块通常会导致未定义行为,甚至可能造成双重释放漏洞(Double Free Vulnerability)。

野指针和悬空指针编译器不会报错我们如何解决内存问题

点这里:C++内存泄漏检查工具——Valgrind


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

相关文章:

  • 如何用WordPress和Shopify提升SEO表现?
  • vue3项目中内嵌vuepress工程两种实现方式
  • 【JAVA】正则表达式中的中括弧
  • 将大型语言模型(如GPT-4)微调用于文本续写任务
  • AI大模型开发架构设计(14)——基于LangChain大模型的案例架构实战
  • 前端web
  • linux,1.正则表达式, 2.sed工具, 3.awk
  • 华为数通HCIA系列第4次考试-小测-子网划分相关解析
  • 36.Redis核心设计原理
  • MySql-8.0.40安装详细教程
  • Oracle 聚集因子factor clustering
  • NPM镜像源
  • echarts-gl 3D柱状图配置
  • 工位管理优化:Spring Boot企业级系统
  • 零基础上手WebGIS+智慧校园实例(1)【html by js】
  • 有趣的Midjourney作品赏析(附提示词)
  • Python爬虫:获取国家货币编码、货币名称
  • 泷羽sec学习打卡-shodan扫描7
  • 多模态AI:开启人工智能的新纪元
  • 分布式技术缓存技术
  • 若依笔记(八):Docker容器化并部署到公网
  • AI 大模型重塑软件开发流程的现状与未来展望
  • 商淘云连锁企业管理五大功能 收银系统助力门店进销存同步
  • 游戏引擎学习第五天
  • Ubuntu笔记-auto remove
  • app webView调试工具