野指针和悬空指针

C++指针陷阱:野指针、悬空指针与空指针详解 本文深入探讨C/C++指针中的三大问题:野指针(未初始化指针)、悬空指针(指向已释放内存)和空指针(NULL指针)。野指针因未初始化而指向随机地址,可能导致程序崩溃或安全漏洞;悬空指针在对象释放后仍保留旧地址,易引发Use-After-Free漏洞;空指针解引用直接导致崩溃。文章详细分析各类指针的成因、危害及检测方法,并提出防御措施:初始化指针、释放后置空、使用智能指针(C++)及静态/动态分析工具。通过典型案例展示问题场景与修复方案,强调指针安全对程序稳定性的重要性。 阅读详情

野指针:

野指针指向一个已删除的对象或未申请访问受限内存区域的指针。与空指针不同,野指针无法通过简单地判断是否为NULL避免,而只能通过养成良好的编程习惯来尽力减少。对野指针进行操作很容易造成程序错误。

(1)成因

野指针主要是因为这些疏忽而出现的删除或申请访问受限内存区域的指针。

a.指针变量未初始化:任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。

b.指针释放之后未置空:有时指针在free或delete后未赋值 NULL,便会使人以为是合法的。别看free和delete的名字(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。此时指针指向的就是“垃圾”内存。释放后的指针应立即将指针置为NULL,防止产生“野指针”。

c.指针操作超越变量作用域:不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。示例程序如下:

[html]  view plain  copy
  1. class A {  
  2. public:  
  3.   void Func(void){ cout << “Func of class A” << endl; }  
  4. };  
  5. class B {  
  6. public:  
  7.   A *p;  
  8.   void Test(void) {  
  9.     A a;  
  10.     p = &a; // 注意 a 的生命期 ,只在这个函数Test中,而不是整个class B  
  11.   }  
  12.   void Test1() {  
  13.   p->Func(); // p 是“野指针”  
  14.   }  
  15. };  

函数 Test1 在执行语句 p->Func()时,p 的值还是 a 的地址,对象 a 的内容已经被清除,所以 p 就成了“野指针” 。

(2)规避

a.初始化时置 NULL

指针变量一定要 初始化为NULL,因为任何指针变量(除了static修饰的指针变量)刚被创建时不会自动成为NULL指针,它的 缺省值是随机的。
b。释放时置 NULL
当指针p指向的内存空间释放时,没有设置指针p的值为NULL。delete和free只是把内存空间释放了,但是并没有将指针p的值赋为NULL。通常判断一个指针是否合法,都是使用if语句测试该指针是否为NULL。例如:
[html]  view plain  copy
  1. int *p=newint(6);  
  2. delete p;  
  3. // 应加入 p=NULL; 以防出错  
  4. // ...  
  5. if(p != NULL)  
  6. {  
  7.   *p=7;  
  8.   cout << p << endl;  
  9. }  
对于使用 free 的情况,常常定义一个宏或者函数 xfree 来代替 free 置空指针:
[html]  view plain  copy
  1. #define xfree(x) free(x); x = NULL;  
  2. // 在 C++ 中应使用 nullptr 指代空指针  
  3. // 一些平台上的 C/C++ 已经预先添加了 xfree 拓展,如 GNU 的   
  4.    
  5. libiberty  
  6. xfree(p);  
  7. // 用函数实现,例如 GitHub 上的 AOSC-Dev/Anthon-Starter #9:  
  8. static inline void *Xfree(void *ptr) {  
  9.     free(ptr);  
  10. #ifdef __cplusplus  
  11.     return nullptr;  
  12. #else  
  13.     return NULL;  
  14. #endif  
  15. }  
  16. q=Xfree(q);  

所以动态分配内存后,如果使用完这个动态分配的内存空间后,必须习惯性地使用delete操作符取释放它。
悬空指针:
在C/C++等语言中,悬空指针(Dangling Pointer)指的是:一个指针的指向对象已被删除,那么就成了悬空指针。 野指针是那些未初始化的指针。
[html]  view plain  copy
  1. int main(){  
  2. char*dp = NULL;  
  3. for(i=0;i<1;i++) {  
  4. char c;  
  5. dp =&c;  
  6. }  
  7. /* 注意c的声明周期 */  
  8. /* dp 此时为悬空指针 */  
  9. }  
  10. //这里for循环只是说明c是局部变量  
  11. void f(){  
  12. char*dp;  
  13. /* dp 未初始化,是野指针 */  
  14. }  
[html]  view plain  copy
  1. //有时也把野指针和悬空指针通称悬空指针  

len值都为0,如何判断是空指针还是空串导致其值为0?

null与空串的区别

1, null不占用空间,空字符串占用一定内存空间

2, null可以赋值给任何对象,而空字条串只能赋值给String

3, 调用null的方法会返回nullpointerexception,调用空字符串的方法不会报错

4, null本身就是个对象,但它是一个不确定的对象,只能给引用形变量赋值,不能给基本类型赋值.(如 int a=null;是错误的)

详解C语言那些可怕的野指针 关注、星标公众号,直达精彩内容来源:技术让梦想更伟大作者:李肖遥一、什么是野指针?指针是C语言的灵魂,同时也是很容易让人犯错的重难点,用错了指针将是一个灾难。指针变量的本质是值,这个特殊的... 阅读详情

相关推荐

opencv实践项目-图片拼接之缝合线算法

opencv 图片缝合线算法

wyw0000的博客 2623

野指针概念、定义、及如何规避野指针

野指针概念、定义、及如何规避野指针

fancynthia的博客 2万+

谈谈SAP顾问的几个发展趋势

大家新年好,今天想聊一下对SAP顾问发展趋势的一些个人见解。过去10多年得益于我国的经济发展,外资不断加大在中国的投资和中国企业的发展,SAP顾问行业得到了很大的发展和壮大。那么未来几年SAP顾问的职业发展到底怎么样呢?

syounger的专栏 2509

野指针?悬空指针? 一文带你搞懂!

???? 作者:Linux猿 ???? 简介:优快云博客专家????,C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊! ???? 关注专栏:C/C++面试通关集锦(优质好文持续更新中……)???? 目录 一、野指针 二、悬空指针 2.1 情况一 2.2 情况二 2.3 情况三 野指针和悬空指针是指针中常见的两个概念,本文结合实例讲解来讲解下。 一、野指针 野指针是指尚未初始化的指针,既不指向合法的内存空间,也没有使用 NULL/nullptr 初始化指针。 来看一个简单

Muti-Agent 1万+

使用Java实现CRC16 MODBUS 格式校验

CRC16校验,测试如下 String str = "a5 98 03 00 00 5f c6 0f 7c 40 78 06 09 46 dc 6e db 00 16 3e 12 5c 98 00 19 98 0e 10 03 06 09 46 dc 6e db 03 0b bf 5f c6 0f 7c 43 bd b9 61 ee 96 76 99"; 校验规则: /** * CRC16_CCITT:多项式x16+x12+x5+1(0x1021),初始值0x0000,低位在前,高位在后,结

weixin_45063710的博客 1312

UFS 功能描述:UFS boot

UFS 启动过程介绍:启动配置,启动代码下载过程和安全性

m0_51720747的博客 1600

什么是野指针

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

Doublelv 的博客专栏。 6857

TX 的 LOL(Local Oscillator Leakage,本振泄露)

项目内容LOL 是什么本振残留在 TX 输出中心频率上的杂散主要原因IQ 失衡、硬件不完美、零中频架构影响杂散、干扰、性能劣化、安全问题解决方法初始化校准 + 跟踪校准(AD9371 支持)检测手段频谱仪、回环检测、ADC ILA 抓取。

weixin_41230430的博客 2044

C++之深入解析野指针和悬空指针

野指针指向一个已删除的对象或未申请访问受限内存区域的指针。与空指针不同,野指针无法通过简单地判断是否为NULL避免,而只能通过养成良好的编程习惯来尽力减少,对野指针进行操作很容易造成程序错误。

╰つ栺尖篴夢ゞ 2429

Python爬虫实战:深度解析B站弹幕异步采集技术与数据可视化

title=f"弹幕词云 Top 100 (BV: {bvid})", title_textstyle_opts=opts.TextStyleOpts(font_size=23).add(series_name="弹幕词云", data_pair=list(top_100_words.items()), word_size_range=[20, 100]).add_xaxis([f"{i}-{i+1}分" for i in range(len(time_distribution))])

2201_76125261的博客 640

ESP32-IDF开发之旅 基础篇⑪ ESP-IDF 任务看门狗以及多核任务

本文介绍了ESP-IDF中的任务看门狗(TWDT)和多核任务管理。TWDT用于监控任务是否被挂起,可同时监视双核任务,通过定时喂狗机制检测任务阻塞。文中详细讲解了TWDT的配置方法、订阅流程及示例代码,并演示了如何触发和处理看门狗超时。针对ESP32双核特性,重点介绍了xTaskCreatePinnedToCore函数的使用,说明如何将任务绑定到指定核心(CPU0/CPU1)运行,并提供了多核任务创建的代码示例。这些机制对提高系统稳定性和优化多核性能至关重要。

单片机菜鸟哥的博客 264

野指针和悬空指针详解

悬空指针是指向已被释放或超出作用域的内存区域的指针。此类指针原本指向有效的内存或对象,但当该内存被释放或对象生命周期结束后,指针依然指向这块无效的内存区域。这种指针从未指向一个合法的内存地址,因此是完全不可预测的,可能指向任意地址。可以看到虽然delete后指针对象仍然存在,但是指针已经失效,内存已被释放。:函数内部的局部变量地址在函数返回后被销毁,指向它的指针就成为悬空指针。delete或者free是释放指针指向内存 指针本身并未被处理。:指针算术操作导致越界,指针指向无效区域。

weixin_72492465的博客 798

五、实战pxe安装ubuntu 22.04 软raid1(实际生产pxe配置)

这段配置文件是一个cloud-init的自动安装配置,用于自动化部署Ubuntu服务器操作系统。它定义了从系统身份、键盘布局、区域设置到磁盘分区和RAID配置的一系列设置,并且包含了在安装过程的最后阶段执行的一些命令。基础设置version: 1指定了autoinstall配置文件的版本。source定义了安装源,这里是ubuntu-server。identity设置了主机名(hostname)、用户(username)和密码(password注意这里的密码是经过加密的。键盘与语言设置。

jundao1997的专栏 999

“悬空指针”和“野指针”究竟是什么意思?

关注、星标公众号,不错过精彩内容素材来源:网络编辑整理:strongerHuang提起C语言大部分开发者很自然就会想到指针二字,没错,作为C的核心和灵魂,它的地位咱们就不再赘述了,今天我...

strongerHuang 3188

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

什么是野指针和悬空指针?

和都是在C/C++编程中常见的错误,它们会导致程序行为不可预测,甚至引发崩溃或安全漏洞。

weixin_47151388的博客 804

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

c语言悬空指针和野指针

悬空指针 c语言中的指针可以指向一个块内存,如果这块内存稍后被操作系统回收(被释放),但是指针任然指向这块内存,那么,此时此刻指针就是“悬空指针”。 void *p = malloc(size); assert(p); free(p); //现在p是一个悬空指针 C语言中的“悬空指针”=会引发不可预知的错误,而且这种错误一旦发生,很难定位。因为在free(p)之后,p指针任然指向之前分配的内存,如果这块内存暂时可以被程序访问并且不会造成冲突,那么之后使用p并不会引发错误。 所以实际的c语言开发中,为了避免

weixin_44621617的博客 561

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【数据结构】悬空指针和野指针

【数据结构】悬空指针和野指针一、悬空指针二、野指针三、小结 一、悬空指针   在C/C++中,一个指针指向的对象被删除后,该指针变量就变为悬空指针,即指向非法内存,如果所释放的空间被再分配而继续访问该指针所指对象,就会发生“悬挂访问”,可想而知,这种访问会引发恶劣后果。   例如,下列程序段执行的结果使得指针变量p悬空。 int main(){ int num=1; int *p,*q; p=(int*)malloc(sizeof(int)); *p=num; cou

小姚的博客 924

C++ 野指针和悬空指针

都是是指向无效内存区域(这里的无效指的是"不安全不可控")的指针,访问行为将会导致未定义行为。 野指针:指的是没有被初始化过的指针。 intmain(void){ int*p; std::cout<<*p<<std::endl; return 0; } 因此,为了防止出错,对于指针初始化时都是赋值为nullptr,这样在使用时编译器就会直接报错,产生非法内存访问。 悬空指针:指针最初指向的内存已经被释放了的一种指针。 int main(void)...

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 2154

【Go】野指针和悬空指针

野指针与悬空指针野指针悬空指针 野指针 野指针是指一种指向的内存位置不可知的指针,一般是由与指针变量在声明时未初始化导致。 对野指针的操作会引发panic var ptr *int //声明指针类型变量 fmt.Printf("%p\n", ptr) //0x0 fmt.Println(ptr) //nil *ptr = 10 //panic a := 10 ptr = &a //初始化 悬空指针 悬空指针是指指针所指向的内存空间已经被释放了。 在Go语言中,若果函数内

weixin_45919793的博客 889

【C++八股】野指针和悬空指针

未被初始化的指针,指向随机的内存地址。

2301_79867980的博客 399
上一篇: STL基本容器使用
下一篇: c++11智能指针解析——揭开底层面纱,完整理解智能指针
imJaron
博客等级 码龄11年 121粉丝 286原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值