面试八-存泄漏是什么,有哪几种,怎么解决?

devtools/2024/9/23 5:00:58/

 一、内存泄漏几种情况

         当使用基类指针指向派生类对象时,如果基类的析构函数不是虚函数,那么在使用基类指针来删除这个对象时,只会调用基类的析构函数,而不会调用派生类的析构函数。这就导致了派生类中的资源无法正确释放,从而可能导致内存泄漏或者未定义行为

二、 智能指针有内存泄漏的问题吗

  1. 循环引用(Circular References):如果存在循环引用(例如,两个对象相互持有对方的智能指针),会导致对象永远无法被释放,从而造成内存泄漏。为了避免循环引用,可以使用std::weak_ptr来打破循环。

  2. 裸指针转换(Raw Pointer Conversion):如果将智能指针转换为裸指针,并在转换后使用裸指针来管理资源,容易造成资源

  3. 泄漏。因为裸指针无法感知智能指针的生命周期,无法自动释放资源。应该尽量避免使用裸指针,或者在必要时使用智能指针的get()函数获取裸指针。

  4. 多线程环境下的问题:在多线程环境下,如果智能指针的引用计数没有正确地进行同步,可能会导致资源的提前释放或内存泄漏。因此,在多线程环境下,需要确保对智能指针的操作是线程安全的。

三、请说说new/delete与malloc/free的区别?

       野指针是指指针指向的内存地址是随机的、未初始化的,或者指向的内存区域未经过分配。野指针可能是在创建指针后没有给它赋值(即未初始化指针),或者是在释放内存后未将指针置空,但继续使用该指针。 

四、 多态

         

  1. 静态多态(编译时多态)

    • 静态多态是在编译时确定调用的函数,通常通过重载(Overloading)来实现。重载是指在同一个作用域中定义了多个同名的函数,但它们的参数列表不同。编译器根据调用时的参数类型来选择合适的函数进行调用。这种多态性的实现方式是在编译时完成的,因此也称为编译时多态。
    • 静态多态的优点是效率高,因为调用的函数在编译时就已经确定,无需在运行时进行额外的查找和计算。但缺点是对于同一个函数名,只能根据参数类型来进行选择,不能根据对象的实际类型来确定调用的函数。
  2. 动态多态(运行时多态)

    • 动态多态是在运行时确定调用的函数,通常通过虚函数(Virtual Function)和继承来实现。虚函数是在基类中声明为虚函数的函数,它可以在派生类中进行重写(Override)。当基类指针或引用指向派生类对象,并通过虚函数调用时,根据对象的实际类型来确定调用的函数,实现动态绑定。这种多态性的实现方式是在运行时完成的,因此也称为运行时多态。
    • 动态多态的优点是能够根据对象的实际类型来确定调用的函数,实现灵活的多态性。但缺点是在运行时需要额外的开销来查找虚函数表并确定调用的函数,可能会有一定的性能损失。

http://www.ppmy.cn/devtools/45570.html

相关文章

Shell编程之正则表达式

正则表达式 概述 定义 regex,使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,是一种匹配字符串的方法,通过一些特殊符号,实现快速查找、删除、替换某个特定字符串 用途 可以通过正则表达式快速提取需要的信息 基础正则表达…

力扣14. 最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。 示例 1: 输入:strs ["flower","flow","flight"] 输出:"fl"示例 2: 输…

VTK9.2.0+QT5.14.0绘制三维显示背景

背景 上一篇绘制点云的博文中,使用的vtkCameraOrientationWidget来绘制的坐标轴,最近又学习到两种新的坐标轴绘制形式。 vtkOrientationMarkerWidget vtkAxesActor 单独使用vtkAxesActor能够绘制出坐标轴,但是会随着鼠标操作旋转和平移时…

52.WEB渗透测试-信息收集-CDN识别绕过(5)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:51.WEB渗透测试-信息收集-CDN识别绕过(4) 端口扫描其他内容参考&…

ORACLE中递归遍历

--查询全部资源信息 select * from urm_class_info --向上遍历树,找到路径直到根节点,指定的是parentid select distinct classid, parentid, namefrom urm_class_infostart with parentid cmdb0000000000000017 connect by prior parentid classid …

JAVA实现人工智能,采用框架SpringAI

文章目录 JAVA实现人工智能,采用框架SpringAISpring AI介绍使用介绍项目前提项目结构第一种方式采用openai1. pom文件: 2. application.yml 配置3.controller 实现层 项目测试 JAVA实现人工智能,采用框架SpringAI Spring AI介绍 Spring AI是AI工程师的一个应用框架…

redis基础学习

redis是一个键值对类型的NoSql类型的数据库。 NoSql(Non-relational SQL的缩写,也有人看作是not only sql的缩写)型数据库,具有以下特征: 1、非结构化:几乎没有约束,约束很少,这要看…

加密资产私钥安全完整手册(一) ,bitget钱包为例

比特币和以太坊等加密货币的兴起开创了数字金融的新时代,但也带来了独特的安全挑战。这些代表现实世界价值的数字资产已成为黑客和窃贼的主要目标。为了安全地应对这种情况,了解私钥的基本概念至关重要。 私钥是加密货币所有权和安全性的基石。它们相当于…