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;

}

相关推荐
2501_9381400740 分钟前
做内容很省心,2026好用AI笔记,支持抖音小红书视频无水印保存
人工智能
sell-cloud3 小时前
Prompt Engineering要凉了?Fable 5.5能“猜“意图,但银行正在封杀AI Agent——企业AI的真正护城河是什么
人工智能·prompt
不会就选b3 小时前
C++补充部分(一)--lambda 表达式
开发语言·c++
Navicat中国5 小时前
Navicat 18 内置 AI 助手让数据库开发从繁琐操作迈向智能协作
大数据·人工智能·数据库开发
4SAPI5 小时前
多模型请求路由怎么设计?成本、速度和能力如何平衡
人工智能·python·gateway·php
魔乐社区5 小时前
翼芯・智算测试与适配优化专区,让国产算力“选得准、跑得通、用得好“
人工智能·开源·大模型
XCDoris7 小时前
郴州logo设计机构
大数据·人工智能·python
Goboy8 小时前
一个人带三个Agent,我用全新TRAE从0到1搭了个资讯周刊站
人工智能·trae
俊哥V8 小时前
每日 AI 研究简报 · 2026-10-19
人工智能·ai
AI_AGENT_DEV_AI8 小时前
AI英语教培智能体的开发
人工智能