常见内存泄漏场景
- 未配对的
new/delete
或malloc/free
- 容器未清空(如
std::vector
未释放元素指针) - 循环引用导致智能指针失效
- 异常抛出中断资源释放流程
排查工具与方法
工具推荐
- Valgrind(Linux):检测未释放内存及非法访问
- Dr. Memory(Windows):类似Valgrind的轻量级工具
- Visual Studio诊断工具:集成内存分析功能
代码实践
class LeakExample {
public:
LeakExample() { data = new int[100]; }
~LeakExample() { delete[] data; } // 若未定义析构函数则泄漏
private:
int* data;
};
竞赛案例设计
- 基础题:简单指针未释放(如单例模式未处理)
- 进阶题:多线程环境下的泄漏(如互斥锁保护不足)
- 陷阱题:STL容器与智能指针的混合使用
评分标准与技巧
- 准确性:完全定位泄漏点及根本原因
- 效率:最短时间内完成问题修复
- 创新性:使用非传统工具(如自定义内存追踪器)
优秀解决方案分享
- 结合RAII(资源获取即初始化)设计防泄漏类
- 使用
std::shared_ptr
与std::weak_ptr
打破循环引用 - 宏定义重载
new/delete
记录分配位置
总结与资源推荐
- 强调静态代码分析(如Clang-Tidy)的重要性
- 开源工具集(如AddressSanitizer)的实战链接
- 推荐《Effective C++》中内存管理相关章节