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

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(使用前将#替换为@)

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

  • Java删除字符串中指定字符的方法分享

    转自 xff1a Java如何删除字符串中指定字符呢 xff1f 字符串 字符串主要用于编程 xff0c 概念说明 函数解释 用法详述见正文 xff0c 这里补充一点 xff1a 字符串在存储上类似字符数组 xff0c 所以它每一位的单个元
  • Java中Collections.singleton方法起什么作用呢?

    转自 Java中Collections singleton方法起什么作用呢 xff1f 下文笔者讲述Collections singleton方法的功能简介说明 xff0c 如下所示 Collections singleton方法功能 返回
  • Java如何借助Stream流进行求和呢?

    转自 Java如何借助Stream流进行求和呢 xff1f list简介 集合就是把具有相同属性的东西放在一起 xff0c 也可以是容器 xff0c 把有关的东西都放进去 List是位于java util下的一个接口 xff0c 有序集合
  • Java JSON格式简介说明

    转自 Java JSON格式简介说明 下文笔者讲述java中JSON格式的相关简介说明 xff0c 如下所示 JSON简介说明 JSON JavaScript Object Notation 是一种轻量级的基于文本的数据交换格式 它采用完全
  • Java 如何使用Matcher.matches()匹配整个字符串呢?

    转自 Java 如何使用Matcher matches 匹配整个字符串呢 xff1f 下文讲述使用Matcher matches 匹配整个字符串的方法分享 xff0c 如下所示 Matcher matches 对整个字符串进行匹配 当整个字
  • Java中如何删除文件呢?

    转自 xff1a Java中如何删除文件呢 下文笔者讲述java中删除文件的方法分享 xff0c 如下所示 实现思路 借助File delete 方法即可实现文件删除操作 File delete语法 public boolean delet
  • Java中Random.nextInt()方法功能简介说明

    转自 Java中Random nextInt 方法功能简介说明 下文笔者将讲述Random nextInt 方法的功能简介说明 xff0c 如下所示 Random nextInt 方法功能 用于随机产生某个范围区间的整数 注意事项 Rand
  • Java中ArrayList之clone()方法的功能说明

    转自 Java中ArrayList之clone 方法的功能说明 下文讲述ArrayList中clone 方法的功能简介说明 xff0c 如下所示 ArrayList Clone 方法的功能简介 clone 方法的功能 用于复制一份Array
  • (附源码)计算机毕业设计SSM智慧小区团购系统

    项目运行 环境配置 xff1a Jdk1 8 43 Tomcat7 0 43 Mysql 43 HBuilderX xff08 Webstorm也行 xff09 43 Eclispe xff08 IntelliJ IDEA Eclispe
  • springboot如何使用soap协议的方式访问webService接口呢?

    转自 springboot如何使用soap协议的方式访问webService接口呢 xff1f 下文笔者讲述springboot采用soap协议的方式访问webService接口的方法分享 xff0c 如下所示 1 引入相应的jar包 lt
  • springboot-starter如何整合阿里云datahub呢?

    转自 springboot starter如何整合阿里云datahub呢 xff1f 下文笔者讲述springboot整合datahub的方法分享 如下所示 Datahub简介说明 DataHub的功能 xff1a 1 与大数据解决方案中K
  • Spring之@Qualifier注解简介及示例

    转自 Spring之 64 Qualifier注解简介及示例 下文笔者讲述 64 Qualifier注解功能简介及示例分享 64 Qualifier注解功能简介 功能1 使用bean名称注入DI属性 功能2 设置bean的名称 64 Qua
  • Docker学习一篇就够了

    Docker简介 Docker 是一个开源的应用容器引擎 xff0c 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中 然后发布到任何流行的Linux或Windows操作系统的机器上 也可以实现虚拟化 容器是完全使用沙箱机制 相互之
  • LocalDate与Date相互转换

    1 LocalDate转Date LocalDate date 61 LocalDate of 2006 07 26 ZoneId zone 61 ZoneId systemDefault Instant instant 61 date a
  • mssql sqlserver 将字段null(空值)值替换为指定值的三种方法分享

    摘要 下文将分享两种将字段中null值替换为指定值的方法分享 xff0c 如下所示 实验环境 sqlserver 2008 R2 例 create table test keyId int identity info varchar 30
  • C#调用RabbitMQ实现消息队列

    前言 我在刚接触使用中间件的时候 xff0c 发现 xff0c 中间件的使用并不是最难的 xff0c 反而是中间件的下载 xff0c 安装 xff0c 配置才是最难的 所以 xff0c 这篇文章我们从头开始学习RabbitMq xff0c
  • DataX踩坑2 | 定时任务crontab不执行或报错:/bin/sh: java: command not found

    前面两天写了一个DataX的增量同步脚本 xff0c 今天检查了一下发现定时任务没有执行成功 xff0c 数据并没有同步 以下为排查问题和解决方法 一 定时任务crontab不执行 脚本 xff08 测试用的可以设为每分钟一次 xff1a
  • Thread类的sleep()方法和对象的wait()方法区别

    sleep 方法 xff08 休眠 xff09 是线程类 xff08 Thread xff09 的静态方法 xff0c 调用此方法会让当前线程暂停执行指定的时间 xff0c 将执行机会 xff08 CPU xff09 让给其他线程 xff0

随机推荐