C++中new/delete使用:排查程序内存泄漏及修改后代码验证
你的C++程序内存泄漏问题分析
原程序的内存隐患
- 原程序里每一次
new分配的内存如果没对应delete,肯定会产生内存泄漏。别被“程序结束操作系统会回收”误导——从C++编程规范来说,只要用了new就必须手动释放,尤其是如果程序需要多次运行或长期驻留,这些没释放的内存会一直占用系统资源,就是所谓的内存垃圾。你觉得“无需delete”是错误的,老师说的“每个new对应delete”是正确的编程原则。
修改后代码的泄漏验证要点
要确认修改后的代码有没有泄漏,得盯着这几点:
- 必须保证每块
new出来的内存只被delete一次:你的指针数组里有多个指针指向同一块内存,如果遍历数组每个指针都执行delete,会触发重复释放(属于未定义行为,可能导致程序崩溃)。所以得先把所有唯一的内存地址存下来,只对这些地址执行一次delete操作。 - 举个正确的释放逻辑例子:
// 用unordered_set存储所有唯一的内存指针 std::unordered_set<int*> unique_addrs; // 每次new分配内存后,将指针存入这个集合 // 释放阶段遍历集合,逐个释放内存 for (auto addr : unique_addrs) { delete addr; } // 如果指针数组本身是动态分配的(比如int** arr = new int*[size]),最后还要执行delete[] arr;
更省心的替代方案
- 别用裸指针了,直接用
std::shared_ptr<int>。比如用std::vector<std::shared_ptr<int>>来存储数据:输入已存在的数字时直接复制shared_ptr,不存在就用std::make_shared<int>(输入的数字)创建新对象。这样内存会自动管理,完全不用手动写delete,从根源避免泄漏问题。
内容的提问来源于stack exchange,提问作者drain_
相关产品推荐
相关产品推荐

