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

C++内存管理疑问:循环中*new int是否泄漏?如何正确释放内存?

C++内存泄漏问题解答

代码是否存在内存泄漏?

这段代码存在严重的内存泄漏。

原因:new int(25)会在堆上分配一块int大小的内存并初始化为25,返回指向该内存的指针。但你直接用*解引用把值赋给栈变量num,却没有保存new返回的指针地址——堆内存的唯一标识(指针)丢失后,程序再也无法定位到这块内存进行释放。循环执行200次,就会泄漏200块堆内存,直到程序退出才会被操作系统回收。

如何清理内存?

要解决这个问题,核心是保存new返回的指针,在使用完堆内存后用delete释放。同时满足你要求的*new int赋值方式,代码修改如下:

int main()
{
  for(int i = 0;i < 200;i++)
  {
    int* ptr = new int(25); // 保存堆内存的指针
    int num = *ptr;         // 通过*new int的方式给num赋值
    delete ptr;             // 释放堆内存,避免泄漏
  }
}

为什么之前的delete/free无效?

  • delete必须接收new返回的内存地址才能释放对应堆内存,你之前没有保存指针,自然无法传入正确的地址。
  • free是C语言中配合malloc使用的内存释放函数,C++中用new分配的内存必须用delete释放,不能混用free,而且同样需要指针地址。

更安全的写法(智能指针)

如果不想手动管理指针,可以用C++标准库的智能指针std::unique_ptr,它会在作用域结束时自动释放内存,避免遗忘delete:

#include <memory>

int main()
{
  for(int i = 0;i < 200;i++)
  {
    std::unique_ptr<int> ptr = std::make_unique<int>(25);
    int num = *ptr;
    // 无需手动调用delete,智能指针会自动清理内存
  }
}

内容的提问来源于stack exchange,提问作者Niraj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 14:56:28