面试可能遇到的问题野指针等解决方法

2023-05-16

空指针:一般声明一个指针变量赋值为NULL,这就是空指针,各个类型的空指针都存在确确实实的内存地址,但是不会指向任何有效的值的内存地址,对空指针操作,例如访问属性和方法,会抛出空指针异常,因为空指针指向的内存地址没有对应的物理地址。

野指针:指那些释放内存,但是指针赋值为空,这时候的指针指向任意地址,例如指向内核地址或不属于本程序的内存地址,程序会被kill,即奔溃。

内存泄漏:分为堆泄露和资源泄露 两种,内存分配失败或者内存分配成功却没有指针指向它(即无法操作该内存),会导致内存分配的越来越多,导致系统内存不够而终止程序
(https://blog.csdn.net/jackshiny/article/details/43838919)

野指针出现情况(https://blog.csdn.net/qq_31930499/article/details/80166472):
(1)指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。
解决方法,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存
(2)指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。
free和delete只是把指针所指的内存给释放掉,但并没有把指针本身干掉。free以后其地址仍然不变(非NULL),只是该地址对应的内存是垃圾,p成了“野指针”。如果此时不把p设置为NULL,会让人误以为p是个合法的指针。如果程序比较长,我们有时记不住p所指的内存是否已经被释放,在继续使用p之前,通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。
原文解释代码:

char *p = (char *) malloc(100);
strcpy(p, “hello”);
free(p);   // p 所指的内存被释放,但是p所指的地址仍然不变if(p != NULL)      // 没有起到防错作用
{
    strcpy(p, “world”);      // 出错
}

解决方法:指针指向的内存空间被释放后指针应该指向NULL。
3)指针操作超越了变量的作用范围。这种情况让人防不胜防,示例程序如下:

class A 
{      
public:
     void Func(void){ cout << “Func of class A<< endl; }
};
void Test(void)
{
    A *p;
   {
      A a;
      p = &a; // 注意 a 的生命期 ,只在这个程序块中(花括号里面的两行),而不是整个test函数
   }
     p->Func();  // p是“野指针”
}

超出作用域
解决办法
在变量的作用域结束前释放掉变量的地址空间并且让指针指向NULL

(https://blog.csdn.net/qq_25073253/article/details/82918988)
C++没有垃圾回收机制,我们需要关注那些类型的内存泄漏?
堆内存泄漏。在内存中程序员手动分配的一块内存,malloc\realloc\new。完成相关操作后,没有调用相对应的free\delete释放掉内存,这时这块内存就会常驻内存,造成堆内存泄漏
系统资源泄漏。分配给程序使用的资源没有使用相应函数释放,如bitmap\handle\socket.
解决方法(https://zhuanlan.zhihu.com/p/110313333)
静态检测

所谓静态检测,就是不运行程序,在程序的编译阶段进行检测,主要原理就是对 new 与 delete, malloc 与 free 进行匹配检测,基本上能检测出 大部分 coding 中因为粗心导致的问题。

静态检测包括手动检测和静态工具分析,所谓手动检测嘛,就是叫大牛帮你review啦。下面介绍了常见的静态检测工具。常用的静态检测的工具有 splint, PC-LINT, BEAM 等,每种检测各有千秋,具体使用方法这里不在赘述,网上教程挺多的,也可以直接去看官方说明文档。但是静态检测不能判定跨线程的内存申请与释放。这时候就需要动态检测出场了。

动态检测

所谓动态检测,就是运行程序的过程中,对程序的内存分配情况进行记录并判定。常用的工具有 valgrind, Rational purify 等,没种工具有各自的特点,大家看情况自行选用。对于动态检测来说,最大的弊端就是会加重程序的负担,对于一些大型工程,涉及到多个动态库,带来的负担太重,这时候就需要自己根据需求写一套了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面试可能遇到的问题野指针等解决方法 的相关文章

  • 读书笔记-《银行4.0》

    一 银行4 0 无感知金融 概念 xff1a 通过技术 xff0c 实现从 产品 网点 客户 gt 人 场景 资金 例如从以前的柜员 gt 自动柜员机 xff0c 未来通过更多的应用技术实现无感知金融 xff08 我认为这个可能是趋势 xf
  • 实习周记(附):学习笔记

    因为本人自己有一个存笔记的文件体系 xff0c 这些知识比较散 xff0c 整理后就进入自己的体系了 xff0c 这里就放出未整理 xff08 实习期间的笔记 xff09 本人是javaweb xff0c 如果有同样方向的同学 xff0c
  • 读书笔记-《大数据时代》-Viktor Mayer Schonberger:要全体不要抽样、要效率不要绝对精确、要相关不要因果。

    一 经典摘录 1 大数据和云计算是一个问题的两面 xff1a 问题 问题的解决方法 2 大数据时代处理理念上的三大转变 xff1a 要全体不要抽样 要效率不要绝对精确 要相关不要因果 3 大数据的核心是预测 二 个人感悟 书中大量出现例子
  • java分页的实现,插件PageHelper的使用及原理

    如果你只希望知道PageHelper的用法 xff0c 直接去github查看官网文档 Mybatis PageHelper 1 关于分页 在web项目中 xff0c 分页是一个常见的功能 在我刚学完javaweb的时候在没有用任何框架的情
  • 读书笔记-《Spring技术内幕》-计文柯(三):Spring MVC与We

    一 SpringMVC做了什么 xff1f 1 使用SpringMVC 以及同类型框架 前 xff1a 回顾下 xff0c 我们刚学完JavaWeb时是如何实现前后台数据交互的 首先 xff0c Java文件目录分为Servlet xff0
  • 解决Linux下USB设备节点ttyUSB名不固定的问题,生成固定USB转串口设备节点

    原文链接 xff1a http blog sina com cn s blog 8b58097f0102wxm3 html 感谢博主分享 xff01 xff01 xff01 1 Linux下USB设备节点名不固定问题经常会遇到 以USB转串
  • pixhawk px4 添加自定义mavlink消息

    首先添加一个 uORB topic xff0c 然后添加一个 mavlink 解析程序 xff0c 这将会将一个输入的 mavlink 消息解析并传入 uORB topic 中 注 xff1a 本例程 xff0c nsh仍然看不到消息 xf
  • PX4飞控之导航及任务架构

    感谢博主的分享 xff0c 原文地址 xff1a http blog csdn net zhenglongf article details 77775658 本文重点介绍PX4飞控的Navigator和mission控制框架和逻辑 Nav
  • 树莓派系统拷贝到一张新内存卡

    参考别人的博客是这样的 查看挂载的位置 df h 用df命令然后用umount命令卸载掉 具体方法如 xff1a umount media disk 接着 xff0c 就是把现在的系统完整的复制到新卡上 由于树莓派本身就是Linux系统 x
  • px4 源码中的疑问和记录

    1 在类BlockLocalPositionEstimator定义了很多私有成员如下 general parameters BlockParamInt pub agl z BlockParamFloat vxy pub thresh Blo
  • 超简单!!小白级 PXE 实现无人值守批量安装教程

    author Tresser date 2017 4 9 03 50 此文较长 请细心看完 一定可以成功 实验环境 主机 CentOS 6 5 x86 虚拟机 准备工作 1 本地 yum 仓库 2 DHCP 服务器 3 TFTP 服务器 4
  • HTTP 账号密码验证

    https developer mozilla org zh CN docs Web HTTP Authentication 通用的 HTTP 认证框架 RFC 7235 定义了一个 HTTP 身份验证框架 xff0c 服务器可以用来针对客
  • c语言学习小记:细说字符串的终止符'\0'

    之前在使用字符串的时候 xff0c 总觉得 0 很诡异 xff0c 有些时候有 xff0c 有些时候没有 xff0c 没搞懂 今天偶然看到一本好书 xff0c 书上对 0 进行了详细的介绍 xff0c 通过介绍终于搞清楚了 0 xff0c
  • 算法导论_15.2矩阵链乘法

    一 问题描述 对于矩阵A 2 3 和矩阵A 3 4 相乘 xff0c 总共需要做2 3 4 61 24次乘法 xff1b 因此对于三个矩阵A1 A2 A3做乘法 xff0c 不同的乘法次序会得到不同次数的乘法运算 xff1b 例如 xff0
  • Jetson Nano 入坑之路 ---- (1)Jetson Nano 与 树莓派

    目前市场上 Jetson nano 有两个版本 也就是 2G和4G版 xff0c 不过名字不是这么叫的 xff0c 而是2GB版和B01版 2GB和4GB版本也就是从内存来区分的 xff0c 不过呢 xff0c 仔细一看 xff0c 他们板
  • 【升级公告】让双控更到位,晓帆隐患排查系统三大升级

    好久不见 xff0c 我们有个好消息跟大家分享 晓帆隐患排查系统升级啦 xff01 xff01 相比原来的版本 xff0c 我们做了六大升级 xff0c 新版本让晓帆隐患排查系统更简洁易用 xff0c 帮大家解锁更好的使用体验 xff0c
  • 四旋翼自主飞行器设计方案

    针对2016年湖南省电子设计竞赛的飞行器赛题 xff0c 写一篇四轴的方案 xff0c 适合初学四轴的和想了解四轴的 xff0c 大神级别的可以绕道 1 方案设计 1 1姿态传感器的选择 1 1 1加速度计 加速度检测芯片有 ADXL345
  • 四轴的方案设计

    针对2016年湖南省电子设计竞赛四轴的题 xff0c 写了一篇设计四轴的 xff08 Word文档 xff09 方案 xff0c 适合初学四轴的和想了解四轴的 xff0c 大神请绕道

随机推荐