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

一、内存泄漏几种情况

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

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

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

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

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

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

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

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

四、 多态

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

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

    • 动态多态是在运行时确定调用的函数,通常通过虚函数(Virtual Function)和继承来实现。虚函数是在基类中声明为虚函数的函数,它可以在派生类中进行重写(Override)。当基类指针或引用指向派生类对象,并通过虚函数调用时,根据对象的实际类型来确定调用的函数,实现动态绑定。这种多态性的实现方式是在运行时完成的,因此也称为运行时多态。
    • 动态多态的优点是能够根据对象的实际类型来确定调用的函数,实现灵活的多态性。但缺点是在运行时需要额外的开销来查找虚函数表并确定调用的函数,可能会有一定的性能损失。
相关推荐
程序员二叉30 分钟前
【JVM】OOM详解+JVM参数+FullGC排查+CPU飙高+死锁+内存泄漏+命令大全
java·开发语言·jvm·面试
柒和远方1 小时前
后端认证、鉴权、高并发:从 Session 到 JWT 再到 Redis
前端·后端·面试
JieE2121 小时前
JS 到底有多少种数据类型?从ECMA规范到内存本质,一文彻底搞懂
javascript·数据结构·面试
Tenaryo5 小时前
「底层系统基石 · 缓存篇」V —— 写策略、Store Buffer 与内存屏障
后端·面试
AC赳赳老秦6 小时前
OpenClaw 助力技术面试:自动生成面试题、模拟面试、整理面试知识点
开发语言·python·面试·职场和发展·自动化·deepseek·openclaw
8Qi86 小时前
LeetCode 4:寻找两个正序数组的中位数 —— 二分查找法
java·算法·leetcode·职场和发展·二分查找
林间码客6 小时前
智能旅行规划助手 — 实习面试问答手册
面试·职场和发展
8Qi86 小时前
LeetCode 32:最长有效括号 —— 栈 + 标记法 题解
java·数据结构·算法·leetcode·职场和发展··括号匹配
自由路飞7 小时前
Trellis 从 0 到 1 实战指南:让 AI 从"随便聊聊"变成"项目协作者"
面试
浮午7 小时前
腾讯AI应用开发一面实录:13道硬核面试题全解析
人工智能·面试·职场和发展