C/C++动态内存:堆内存的申请、使用与释放

在C/C++程序里,内存分为栈、堆、全局区等不同区域。栈内存由系统自动分配回收,大小有限;而堆内存交给程序员自主掌控,运行时按需申请、手动释放。

堆内存灵活强大,但一旦管理不当,就会出现内存泄漏、野指针、程序崩溃。本次分享,我们就完整梳理堆内存从申请、使用到释放的全过程。

PPT大纲

  1. 栈内存 vs 堆内存
  • 栈:函数内局部变量,自动分配自动回收,空间小,大小编译期基本确定

  • 堆:手动申请,生命周期由开发者决定,空间大,运行时确定大小

  • 什么时候必须用动态堆内存?

  1. C语言堆内存操作:malloc / calloc / realloc / free
  • malloc(size_t size) :分配原始内存,不初始化,失败返回NULL

  • calloc(size_t num, size_t size) :分配num个大小为size的内存,初始化为0

  • realloc(void* ptr, size_t new_size) :对已有堆内存扩容/缩容,可能移动内存地址

  • free(void* ptr) :释放堆内存,注意:free之后指针不会自动置空

  • 代码示例 + 编码要点:必须检查返回值、不能free栈地址

  1. C++堆内存操作:new / delete
  • new :分配堆内存 + 调用构造函数初始化对象

  • delete :调用析构函数 + 释放堆内存

  • new\[\] / delete\[\] :对象数组的动态分配释放,必须成对使用

  • 核心差异:malloc只分配裸内存,new会执行对象构造逻辑

  1. 堆内存使用的常见错误

  2. 内存泄漏:申请堆内存,忘记free/delete

  3. 野指针:内存释放后继续访问原指针

  4. 重复释放:同一块堆内存多次free/delete

  5. API混用:malloc分配,delete释放(错误)

  6. 越界读写:访问超出分配的内存范围

  7. 现代C++优化思路:RAII与智能指针

  • RAII:资源获取即初始化,利用对象生命周期自动释放资源

  • std::unique_ptr 、 std::shared_ptr :自动释放堆内存,降低手动管理风险

  • 智能指针不是万能,依然存在循环引用等问题

  1. 代码演示 + 内存问题排查工具
  • 正常申请释放示例

  • 错误案例演示(泄漏、野指针)

  • 内存检测工具:Valgrind、VS内存诊断

  1. 堆内存的完整生命周期:申请 → 使用 → 释放。

手动管理内存,既是C/C++高性能的来源,也是bug高发区。优先养成规范,现代C++尽量使用智能指针减少手动操作。

演示代码示例

cpp

#include <iostream>

#include <cstdlib> // malloc free

#include <memory> // unique_ptr

using namespace std;

void c_malloc_demo()

{

int* p = (int*)malloc(sizeof(int));

if (p == nullptr) return;

*p = 100;

cout << *p << endl;

free(p);

p = nullptr;

}

void cpp_new_demo()

{

int* p = new int(200);

cout << *p << endl;

delete p;

p = nullptr;

}

void smart_ptr_demo()

{

unique_ptr<int> p(new int(300));

cout << *p << endl;

// 离开作用域自动释放,无需手动delete

}

int main()

{

c_malloc_demo();

cpp_new_demo();

smart_ptr_demo();

return 0;

}

相关推荐
龙腾AI白云1 小时前
AI检索增强生成(RAG):解决大模型幻觉的核心落地技术
数据库·人工智能·机器学习·知识图谱
云票1 小时前
企业对接AI合同审查系统的工程实践
人工智能
admin and root1 小时前
「AI安全篇」实战AntiDebug自动化JS逆向加解密MCP
javascript·人工智能·网络安全·自动化·漏洞挖掘·cnvd·src赏金
智能RPA1 小时前
智能体自动化平台与主数据管理平台(MDM)对比评测
人工智能·自动化·agent·rpa
朔北之忘 Clancy2 小时前
2025 CSP-J 第二轮真题解析
c++·青少年编程·题解·noip·csp·信奥赛·noi
longlongzihan2 小时前
LeetCode 17电话号码的字母组合:回溯算法(DFS)详解
c++·算法·leetcode·深度优先
跨境小彭2 小时前
Temu拉美站点铺货实操复盘:手动复制痛点与批量自动化解决方案
服务器·人工智能·搜索引擎·自动化·temu电商运营
yolo_guo2 小时前
调试mysql延迟与libevent回调实际发送回复时机问题
c++·mysql·libevent
封印师请假去地球钓鱼2 小时前
边解边变的问题:从“决策依赖“一词出发
人工智能·算法
AI搅拌机2 小时前
ComfyUI管理大师:安全稳定升级+切换指定版本!
人工智能