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

C++内存管理:new/delete与内存泄漏实战

一、上期回顾

掌握函数模板、类模板、泛型编程、模板特化,理解了 STL 容器能适配任意类型的底层原因。今天攻坚C++ 内存管理,搞定 new/delete、内存分区、野指针、内存泄漏四大核心痛点。

二、C/C++ 程序内存五大分区

程序运行时内存划分为 5 块,面试必背:

  1. 栈区:局部变量、函数形参、栈对象;自动分配自动释放
  2. 堆区:new/malloc 开辟的空间;手动申请手动释放
  3. 全局 / 静态区:全局变量、static 静态变量;程序全程存在
  4. 常量区:字符串常量、const 全局常量;只读不可修改
  5. 代码区:存放二进制程序指令,只读

三、malloc/free 与 new/delete 核心区别

1. C 语言 malloc/free

  • 只分配原始内存,不调用构造、析构函数
  • 需要强转类型、手动计算字节大小
  • 不会初始化内存
int* p = (int*)malloc(sizeof(int)); free(p);

2. C++ new/delete

  • 分配内存 + 自动调用构造函数
  • 释放内存 + 自动调用析构函数
  • 无需计算大小、无需强转
  • 支持数组形式 new [] /delete []
int* p = new int; delete p; // 数组开辟 int* arr = new int[5]; delete[] arr;

核心区别总结

  1. new 自动调用构造,malloc 只开空间
  2. new 无需强转、自动计算大小
  3. delete 自动调用析构,free 直接回收内存
  4. 数组必须配对new[]delete[]

四、new 的三种使用形式

// 1. 普通开辟单个变量 int* p1 = new int; // 2. 开辟并初始化 int* p2 = new int(100); // 3. 开辟数组 int* p3 = new int[5];

五、内存泄漏成因与规避

什么是内存泄漏

堆空间用new申请后,没有 delete 释放,程序不退出内存一直占用。

常见泄漏场景

  1. 函数内 new,没有返回也没有释放
  2. 指针重新赋值,旧地址丢失无法释放
  3. 类中堆成员,析构函数没写 delete

避坑原则

谁申请,谁释放;成对使用 new/delete


六、野指针成因与危害

野指针定义

指向非法未知内存的指针,没有有效指向。

产生原因

  1. 指针未初始化,随机地址
  2. 指针指向栈变量,变量销毁后指针悬空
  3. 内存释放后,未把指针置空

规避方法

  1. 定义指针初始化为nullptr
  2. 释放内存后立刻置空
  3. 不访问悬空指针
// 规范写法 int* p = new int; delete p; p = nullptr; // 置空,避免野指针

七、内存经典错误示范

错误 1:重复释放

int* p = new int; delete p; delete p; // 崩溃,重复释放

错误 2:数组不匹配 delete []

int* arr = new int[5]; delete arr; // 错误,必须 delete[]

错误 3:野指针访问

int* p; *p = 10; // 未初始化,野指针崩溃

八、构造析构与 new/delete 联动演示

#include <iostream> using namespace std; class Test { public: Test(){cout << "构造函数调用" << endl;} ~Test(){cout << "析构函数调用" << endl;} }; int main() { // 栈对象:自动构造、自动析构 Test t1; // 堆对象:new触发构造,delete触发析构 Test* t2 = new Test; delete t2; return 0; }

运行结果:

构造函数调用 构造函数调用 析构函数调用 析构函数调用

九、今日核心总结

  1. 内存五分区:栈、堆、全局静态、常量、代码区
  2. new/delete 比 malloc/free 多了构造析构调用
  3. 数组必须严格配对new[]delete[]
  4. 内存泄漏:new 不 delete;野指针:未初始化 / 悬空指针
  5. 开发规范:指针初始化为空、释放后置空、成对申请释放

十、课后练习

  1. 用 new 开辟单个 int 并初始化,delete 释放
  2. 尝试不 delete 观察内存泄漏逻辑
  3. 定义未初始化指针,理解野指针危害
http://www.jsqmd.com/news/789063/

相关文章:

  • UE5地编新手避坑指南:从硬件配置到资产命名,保姆级入门清单
  • 基于Go与SQLite的本地优先预算工具:CLI驱动与AI智能体集成实践
  • 昆明黄金回收推荐!别再被坑了,5家靠谱回收商亲测推荐 - charlieruizvin
  • 2026年厨房餐具厨具京东代运营专业深度测评:品牌排名前五权威发布! - 电商资讯
  • 上千万人选择的黄金回收机构,重庆收的顶,全国四百多门店 - 奢侈品回收测评
  • 国防经济考研辅导班推荐:专门针对性培训机构评测 - michalwang
  • 电子工程白皮书撰写:技术传播与工程实践指南
  • 基于无头浏览器与Puppeteer的ChatGPT API模拟器部署与实战指南
  • 别再搞混了!QGIS 3.20+ 和 3.18 之前版本安装Python库的正确姿势(附版本区别详解)
  • 军种战役学考研辅导班推荐:专门针对性培训机构评测 - michalwang
  • Adobe-GenP 3.0终极指南:3步解锁Adobe全家桶完整功能的免费方案
  • 3分钟搞定!Blender 3MF插件终极指南:让3D打印文件转换变得如此简单
  • AI工具搭建自动化视频生成Wipster
  • 2026瑞祥商联卡回收平台实测口碑榜:TOP3安全高效平台推荐 - 京顺回收
  • FPGA硬件视角:拆解IOBUF原语,看一根引脚如何分时扮演输入和输出
  • MySQL导入SQL文件报错1046?详解“No database selected”的根源与一键修复
  • AI助力京剧:Gemini3.1Pro修复失传剧本
  • 【Unity × Steam】从零到一:成就系统集成与多语言适配实战
  • 2026年AI时代论文收藏教程:从查重率修罗场到一键降重、降AI率 - 降AI实验室
  • ​回顾凯旋广州公司成功挂牌!大力推动内地企业借注册澳门公司出海 - GrowthUME
  • 基于Streamlit与Gemini API构建轻量级AI代码生成与对话工具
  • 如何用免费离线OCR软件轻松提取图片文字?Umi-OCR全功能指南
  • 构建智能分诊与供应链协同平台:从规则引擎到数据总线的实战指南
  • 佛山手表回收避坑指南:这5类套路要当心,附5家正规门店 - 奢侈品回收测评
  • 5分钟搞定:Scroll Reverser终极配置指南 - 彻底解决macOS滚动方向混乱问题
  • 告别D-Bus臃肿:在嵌入式Linux上用BlueZ MGMT接口实现轻量级BLE从设备
  • 深度解析SMUDebugTool:AMD Ryzen处理器底层硬件调试架构剖析
  • 浙南公立医美优选:温州市中心医院百里坊院区,叶英海主任医师匠心塑美 - GrowthUME
  • 基于MCP协议构建AI钱包助手:安全架构与Claude集成实践
  • 什么是体视荧光显微镜 - 实了个验