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

C++函数入参中new创建对象析构未触发及内存泄漏问题咨询

#include<iostream>
#include<stdlib.h>
using namespace std;

class car
{
public:
    string name;
    int num;

public:
    car(string a, int n)
    {
        cout << "Constructor called" << endl;
        this->name = a;
        this->num = n;
    }
    ~car()
    {
        cout << "Deleted" << endl;
    }
};

void display(car* p)
{
    cout << "Name: " << p->name << endl;
    cout << "Num: " << p->num << endl;
}

int main()
{
    display(new car("HYUNDAI", 2012));
}

问题1:析构函数未被调用的原因

C++中new创建的是堆内存对象,生命周期由开发者手动管控,只有对对应指针执行delete操作时,才会触发析构函数执行,同时释放对应的堆内存。你的代码中仅在传参时通过new创建了对象,全程没有调用delete,因此析构函数不会执行。

栈对象和堆对象的生命周期逻辑不同:栈分配的对象出作用域时会自动调用析构函数,堆分配的对象没有自动回收逻辑,必须手动delete。

问题2:该写法是否会引发内存泄漏

会引发内存泄漏。你通过new申请的堆内存,在display函数执行完成后,没有任何指针持有该内存的首地址,你也无法再对这块内存执行delete操作,程序运行过程中这块内存会一直被占用,直到程序退出后才会由操作系统统一回收,属于典型的内存泄漏场景。

修复方案

方案1:手动管理内存

提前保存new返回的指针,使用完成后手动delete:

int main()
{
    car* my_car = new car("HYUNDAI", 2012);
    display(my_car);
    delete my_car; // 手动释放,触发析构函数执行
    return 0;
}

方案2:使用智能指针自动管理(C++11及以上版本支持)

用std::unique_ptr/std::shared_ptr托管堆对象,不需要手动释放,指针出作用域时会自动调用析构、释放内存:

#include <iostream>
#include <memory>
using namespace std;

class car
{
// 类定义和原有逻辑一致
public:
    string name;
    int num;

public:
    car(string a, int n)
    {
        cout << "Constructor called" << endl;
        this->name = a;
        this->num = n;
    }
    ~car()
    {
        cout << "Deleted" << endl;
    }
};

void display(unique_ptr<car> p)
{
    cout << "Name: " << p->name << endl;
    cout << "Num: " << p->num << endl;
}

int main()
{
    display(make_unique<car>("HYUNDAI", 2012));
    // 无需手动释放,智能指针出作用域自动回收
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 22:45:04