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

C++析构函数自动调用与内存泄漏相关技术咨询

解答你的C++析构函数与内存泄漏疑问

嘿,我来帮你把这两个问题掰扯清楚:

1. 析构函数的自动调用 & 非动态变量的销毁

首先明确:C++里的析构函数是会自动调用的——只要对象的生命周期正常走到尽头:比如栈上的对象离开它的作用域时,或者堆上用new创建的对象被delete时,对应的析构函数都会自动触发执行。

至于那些非动态变量(比如你代码里的int x、int y这类成员),你完全不用操心它们的销毁:这些变量是和对象本身绑定在一起的,当对象的内存被回收时,这些成员的内存会被一并释放。对于int这种基本类型来说,它们的“销毁”就是简单的内存释放,编译器会自动安排这个过程,根本不需要你在析构函数里写任何相关代码。

2. 给定代码的内存泄漏分析

先看你贴的这段代码(顺便补个小细节:原代码里class B { int x; }末尾少了分号,我帮你补上了):

class B { int x; };
class A {
    int x;
    int y;
    B* tab[10];
public:
    A(int x, int y){
        this->x = x;
        this->y = y;
        for (int i = 0; i < 10; i++){
            tab[i] = new B;
        }
    }
    ~A(){
        for (int i = 0; i < 10; i++){
            delete tab[i];
        }
    }
};
int main(){
    A a(10, 10);
    return 0;
}

结论:这段代码完全没有内存泄漏

  • 关于B* tab[10]里的指针:你在A的构造函数里用new创建了10个B对象,然后在A的析构函数里逐个用delete释放了这些对象,这部分完全符合C++的内存管理规则,不会有泄漏。
  • 你担心的int x和int y:这俩是A的非动态成员变量,属于栈上对象a的一部分。当main函数结束时,a离开作用域,A的析构函数自动被调用,等析构函数执行完,a占用的所有内存(包括x和y的空间)都会被系统自动回收,根本不会造成内存泄漏。

关于重写析构函数的小提醒

你担心重写默认析构函数会引发意外泄漏——其实只要你在自定义析构函数里正确清理了动态分配的资源(比如这里new出来的B对象),就完全没问题。默认析构函数只会自动处理非动态成员,不会管你手动new出来的堆内存,所以当类里有指向堆资源的指针时,必须自定义析构函数来释放这些资源,你现在的写法是完全正确的。


内容的提问来源于stack exchange,提问作者Please be gentle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:41:51