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

一、内存泄漏几种情况

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

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

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

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

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

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

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

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

四、 多态

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

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

    • 动态多态是在运行时确定调用的函数,通常通过虚函数(Virtual Function)和继承来实现。虚函数是在基类中声明为虚函数的函数,它可以在派生类中进行重写(Override)。当基类指针或引用指向派生类对象,并通过虚函数调用时,根据对象的实际类型来确定调用的函数,实现动态绑定。这种多态性的实现方式是在运行时完成的,因此也称为运行时多态。
    • 动态多态的优点是能够根据对象的实际类型来确定调用的函数,实现灵活的多态性。但缺点是在运行时需要额外的开销来查找虚函数表并确定调用的函数,可能会有一定的性能损失。
相关推荐
数智启示录5 分钟前
Apache Kafka Consumer 扩到 40 个仍不提速:Partition 上限锁死有效并行度 【Kafka合集】
数据库·经验分享·分布式·缓存·面试·kafka·apache
数智启示录12 分钟前
Apache Kafka 幂等 Producer 的边界:Exactly-Once 到了 MySQL 为什么失效 【Kafka合集】
数据库·经验分享·分布式·mysql·面试·kafka·apache
CoderYanger37 分钟前
A.每日一题:3622. 判断整除性
java·程序人生·算法·leetcode·面试·职场和发展·蓝桥杯
数智启示录39 分钟前
Apache Kafka 不只是消息队列:日志与 Offset 分离如何让事件可重放 【Kafka合集】
经验分享·分布式·面试·kafka·apache
数智启示录40 分钟前
Apache Kafka 同 Key 仍会乱序:从分区 Offset 到业务可见的四道边界 【Kafka 合集】
大数据·数据库·经验分享·分布式·面试·kafka·apache
haon11222 小时前
面试高频题与口述框架:怎么把经历讲成故事
面试·职场和发展
黄敬峰13 小时前
Agent Memory 进阶:用 LLM 总结压缩上下文,告别"金鱼记忆"
面试
RisunJan15 小时前
后端高频面试题与解答
面试·职场和发展
我命由我1234517 小时前
Photoshop - Photoshop 把两个 PSD 文件合并
学习·ui·职场和发展·产品运营·产品经理·学习方法·photoshop