L6.1 - 指针与动态内存(拓展)
L6.1 - 指针与动态内存(拓展)
🎯 教学目标
- 掌握指针运算与内存地址操作
- 熟练使用
new
/delete
管理动态内存 - 理解智能指针的工作原理
- 掌握函数指针的高级应用
- 预防内存泄漏与悬空指针问题
🔑 核心知识点
1. 指针基础概念
内存地址可视化模型
1 | 0x1000 [ 10 ] ← int a = 10 |
指针声明三要素:
1 | int* p; // 声明指针变量 |
指针运算原理
1 | int arr[5] = {10,20,30,40,50}; |
2. 动态内存管理
内存分配生命周期图
1 | ┌───────────┐ ┌────────────┐ |
标准操作模板:
1 | int* nums = new int[100]; // 分配数组 |
多维数组动态分配
1 | int** matrix = new int*[rows]; |
3. 智能指针(Modern C++)
智能指针类型对比
类型 | 所有权 | 特点 |
---|---|---|
unique_ptr | 独占 | 零开销,禁止拷贝 |
shared_ptr | 共享 | 引用计数 |
weak_ptr | 观察者 | 解决循环引用问题 |
使用示例
1 | // unique_ptr(独占资源) |
4. 函数指针高级应用
回调函数系统设计
1 | typedef void (*EventHandler)(int); // 定义函数指针类型 |
函数指针数组
1 | void (*operations[])(int, int) = { |
💡 内存管理实战技巧
内存泄漏检测方案
1 |
|
安全指针使用规范
- 初始化原则:声明时立即初始化
- NULL检查:解引用前验证有效性
- 所有权明确:遵循RAII原则
- 禁止野指针:释放后立即置空
1 | delete ptr; |
💣 高危内存问题解析
1. 悬空指针(Dangling Pointer)
1 | int* createNumber() { |
2. 内存泄漏(Memory Leak)
1 | void leakyFunc() { |
3. 双重释放(Double Free)
1 | int* data = new int[100]; |
🧩 经典数据结构实现
链表节点管理
1 | struct Node { |
二维矩阵类
1 | class Matrix { |
🏋️ 配套练习
1. 智能指针实战
- 实现学生管理系统:
- 使用
shared_ptr
管理学生对象 - 实现课程选修关系(使用
weak_ptr
) - 统计对象生命周期
- 使用
2. 内存分配分析器
- 编写内存跟踪器:
- 重载
new
/delete
记录分配信息 - 生成内存使用报告(包含泄漏检测)
- 重载
3. 函数工厂模式
- 创建运算工厂:
- 根据字符串"add"/"mul"返回对应函数指针
- 支持动态扩展新运算
4. 自定义智能指针
-
实现简化版
shared_ptr
:- 包含引用计数器
- 实现拷贝构造函数
- 支持
reset()
方法
5. 循环引用破解
- 设计双向链表:
- 使用
shared_ptr
和weak_ptr
实现 - 验证节点自动释放
- 对比不同实现的内存消耗
- 使用
🛠️ 调试工具指南
Valgrind使用示例
1 | valgrind --leak-check=full \ |
AddressSanitizer配置
1 | # CMakeLists.txt |
内存布局分析工具
1 | cout << "变量地址:" << &var << endl; |
评论