当前位置: 首页 > news >正文

【C++】面试常问八股

5、内存管理

野指针
  • 野指针指的是未进行初始化未清零的指针,不是NULL指针
  • 野指针产生原因及解决方案:
    • 指针变量未初始化:指针变量定义时若未初始化,则其指向的地址是随机的,不为NULL;定义时初始化为NULL合法内存地址
    • 指针被free()或delete之后未置空(NULL):free()和delete将指针指向的内存释放掉(操作系统回收指针指向的内存区域),但是指针变量本身的值不会自动重置;释放内存后立即清空 / 使用智能指针。【if(p!=NULL)只能判断是否为显式空指针】
    • 指针操作超出了变量的作用范围:返回指向栈内存的指针是野指针,栈区内存(局部变量/函数参数)在函数结束时会被释放
内存泄漏
  • 程序在运行过程中,动态分配的堆内存(new)因未正确释放而无法被重新使用的现象。随着程序运行时间的增长,泄漏的内存会逐渐累积,最终可能导致系统可用内存耗尽、程序性能下降甚至崩溃。

  • 内存泄漏的原因:

    • 类的构造函数和析构函数中没有匹配的调用new和delete函数(对象生命周期内动态分配的资源未正确释放):
      • ①堆区创建对象占用内存,却未释放
      • ②类的构造函数中动态地分配了内存,但是析构函数未释放内存,或未正确释放内存
    • 浅拷贝导致重复释放或资源未释放:两个对象指向同一内存,析构时均尝试释放该内存,导致双重释放错误。
    class ShallowCopyClass {
    public:
        int* data;
        ShallowCopyClass(int val) { data = new int(val); }
        ~ShallowCopyClass() { delete data; }
        // 未定义拷贝构造函数,使用默认浅拷贝
    };
    
    ShallowCopyClass a(5);
    ShallowCopyClass b = a; // 浅拷贝,b.data 与 a.data 指向同一内存
    // 析构时,a 和 b 的析构函数均会 delete 同一内存,导致崩溃!
    
    • 基类析构函数未声明为虚函数:C++ 多态机制要求通过虚函数表动态绑定析构函数。若基类析构函数非虚,delete 基类指针时仅调用基类析构函数,子类析构逻辑被跳过;将基类析构函数声明为虚函数,确保子类析构链正确执行
    class Base {
    public:
        Base() { /* 基类资源分配 */ }
        ~Base() { /* 仅释放基类资源 */ } // 非虚析构
    };
    
    class Derived : public Base {
    public:
        int* derived_data;
        Derived() { derived_data = new int(10); }
        ~Derived() { delete derived_data; } // 不会被调用!
    };
    
    Base* obj = new Derived();
    delete obj; // 仅调用 Base::~Base(), Derived::~Derived() 未执行,derived_data 泄漏!
    

相关文章:

  • 雷池WAF动态防护技术实测
  • GTID的基本概念
  • Windows前端开发IDE选型全攻略
  • 《零基础学会!如何用 sql+Python 绘制柱状图和折线图,数据可视化一看就懂》
  • 【大模型应用之智能BI】基于 Text2SQL 的 GenBI 技术调研和深度分析(包含案例)
  • Imagination通过最新的D系列GPU IP将效率提升至新高度
  • C# 根据Ollama+DeepSeekR1开发本地AI辅助办公助手
  • idea里的插件spring boot helper 如何使用,有哪些强大的功能,该如何去习惯性的运用这些功能
  • UE(虚幻)学习(五)初学创建NPC移动和遇到的问题
  • 推送项目与分支管理
  • 使用Docker 部署 LNMP+Redis 环境
  • 算法训练(leetcode)二刷第三十七天 | *300. 最长递增子序列、674. 最长连续递增序列、*718. 最长重复子数组
  • 结构型模式 - 装饰者模式 (Decorator Pattern)
  • ⭐算法OJ⭐位操作 Single Number 系列(C++实现)
  • char和varchar的不同
  • zabbix数据采集以及自定义监控
  • Python零基础学习第二天(条件语句,循环语句)
  • 【C语言】指针笔试题
  • 架构设计系列(六):缓存
  • 【docker】namespace底层机制
  • 从良渚到三星堆:一江水串起了5000年的文明对话
  • 高飞已任南航集团党组副书记
  • 广西百色“致富果”:高品质芒果直供香港,带动近五千户增收
  • 自强!助残!全国200个集体和260名个人受到表彰
  • 李峰已任上海青浦区委常委
  • 恒生银行回应裁员传闻:受影响的员工数目占银行核心业务员工总数约1%