【C++】面试常问八股

news/2025/2/26 21:47:46

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 泄漏!
    

http://www.niftyadmin.cn/n/5869194.html

相关文章

Nmap网络安全审计

🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 Nmap网络安全审计 什么是Nmap Nmap是由Gordon Lyon设计并实现的,于1997开始发布。最初设计Nmap的目的只是希望打造一款强大的端口扫描工具。但是随着…

go基础语法

go基础语法 先下载安装go,然后到vscode下载go插件 1. 基础 输入输出 package main import "fmt" func main(){a:1var b2 var c int //不给初始值得标出变量类型 c3var d stringfmt.Scanf("%s",&d) //接收用户输入fmt.Printf("Hell…

vLLM专题(十三)-结构化输出(Structured Outputs)

vLLM 支持使用 outlines、lm-format-enforcer 或 xgrammar 作为引导解码的后端来生成结构化输出。本文档展示了一些可用于生成结构化输出的不同选项示例。 一、在线服务(OpenAI API) 你可以使用 OpenAI 的 Completions 和 Chat API 生成结构化输出。 支持以下参数,这些参…

结构型模式 - 代理模式 (Proxy Pattern)

结构型模式 - 代理模式 (Proxy Pattern) 代理模式是一种结构型设计模式,它允许通过代理对象来控制对另一个对象(目标对象)的访问。代理对象充当目标对象的接口,客户端通过代理对象间接访问目标对象。 分为两大类 静态代理&#…

互联网+房产中介+装修设计+物料市场+智能家居一体化平台需求书

一、项目概述 1.1 项目背景 随着互联网技术的飞速发展以及人们生活品质的显著提升,传统房产交易、装修设计、家居购物等领域暴露出诸多问题。信息不对称使得用户难以获取全面准确的信息,在房产交易中可能高价买入或低价卖出,装修时可能遭遇…

windows笔记本如何设置显示器和笔记本屏幕显示的一样

windows笔记本如何设置显示器和笔记本屏幕显示的一样 DeepSeek R1 思考 27 秒 思考过程 好的,用户问的是Windows笔记本如何设置显示器和笔记本屏幕显示一样。我需要先理解用户的具体需求。这里的“显示器和笔记本屏幕显示一样”可能有两种情况:一种是希…

数据安全_笔记系列06:数据生命周期管理(存储、传输、使用、销毁)深度解析

数据安全_笔记系列06:数据生命周期管理(存储、传输、使用、销毁)深度解析 数据生命周期管理(存储、传输、使用、销毁)详解 数据生命周期管理(Data Lifecycle Management, DLM)是围绕数据从创建…

汽车无钥匙进入一键启动操作正确步骤

汽车智能无钥匙进入和一键启动的技术在近年来比较成熟,不同车型的操作步骤可能略有不同,但基本的流程应该是通用的,不会因为时间变化而有大的改变。 移动管家汽车一键启动无钥匙进入系统通常是通过携带钥匙靠近车辆,然后触摸门把…