You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 21:27:28