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

为何C++堆上分配对象内存后未释放?是否会造成内存泄漏?

关于C++堆内存未释放的疑问解答

先看你提供的代码:

#include<iostream>
using namespace std;

class car
{
    string name;
    int num;
  
    public:
    car(string a, int n)
    {
        cout << "Constructor called" << endl;
        this->name = a;
        this->num = n;
    }
  
    void enter()
    {
        cin >> name;
        cin >> num;
    }
  
    void display()
    {
        cout << "Name: " << name << endl;
        cout << "Num: " << num << endl;
    }
};
  
int main()
{
    // Using new keyword
    car *p = new car("Honda", 2017);
    p->display();
}

核心问题解答

  1. 是否会产生内存泄漏?
    严格来说,这段代码确实属于内存泄漏:用new在堆上分配的car对象内存,没有通过delete主动释放,且当main函数结束后,指针p会被销毁,我们再也无法访问这块堆内存,符合内存泄漏的定义——已分配的内存无法被回收且无法再被使用。

不过有个特殊情况:当整个进程退出时,操作系统会自动回收该进程占用的所有内存资源(包括这块没释放的堆内存),所以程序运行结束后不会在系统层面留下残留的内存泄漏。但这只是操作系统的兜底行为,不能作为不释放内存的理由。

  1. 为什么示例代码不释放内存?
    网上这类入门示例通常是为了简化演示,只聚焦于new关键字创建堆对象的用法,刻意省略了内存释放的步骤,避免让初学者同时关注多个知识点。另外,因为示例程序运行后马上就会退出,依赖操作系统回收内存,所以作者可能觉得没必要写delete——但这是非常不好的编码习惯,绝对不能在实际项目中模仿。

正确的做法

  • 手动释放:在main函数末尾添加delete p;,主动释放堆内存,这是最基础的内存管理方式。
  • 推荐使用智能指针:C++11及以后标准提供了std::unique_ptr、std::shared_ptr等智能指针,它们会在自身生命周期结束时自动释放指向的堆内存,彻底避免手动管理内存的失误。比如把代码改成:
    int main()
    {
        std::unique_ptr<car> p = std::make_unique<car>("Honda", 2017);
        p->display();
    }
    
    这样不需要手动写delete,内存会被自动回收。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 03:35:18