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

delete指针pa2后,X对象中动态分配的vector内存会被释放吗?

关于C++代码中delete pa2操作的内存管理疑问解答

先贴出对应的代码:

#include <iostream>

using namespace std;

class X {
public:

    float* vector;

    X() {
        this->vector = new float[10];
        for (int i = 0; i < 10; i++) {
            vector[i] = 1;
        }
    }

    X(float* v) {
        this->vector = new float[3];
        for (int i = 0; i < 3; i++) {
            this->vector[i] = v[i];
        }
        delete[]v;
    }

    ~X() {
        delete[]this->vector;
    }
};

int main() {
    X a1;
    X a2(new float[3]{ 100, 100.5, 200 });

    X* pa2 = new X(new float[3]{ 100, 100.5, 200 });

    cout << pa2 << endl;
    cout << pa2->vector[0];

    delete pa2;
}

针对你提出的疑问,逐一解答:

  • X对象的析构函数是否会被调用?
    会调用。pa2指向的是堆上分配的X对象,执行delete pa2时,C++标准会先触发该对象的析构函数执行,再释放对象自身占用的堆内存。

  • 对象内部动态分配的vector数组是否会从堆内存中释放?
    会释放。X类的析构函数中明确写了delete[]this->vector;,当析构函数被调用时,这条语句会执行,将vector指针指向的动态数组从堆中释放。

  • 是否仅指针pa2失去与X对象的关联,X对象仍留存于内存中?
    不会。delete pa2的完整逻辑是:先调用对象的析构函数清理内部资源,再回收对象自身的内存空间。执行后,pa2变成悬空指针,原X对象的内存已经被系统回收,不再留存。

  • 构造X时传入的动态分配数组及对象内的vector是否都会被释放?
    两者都会被释放:

    • 构造时传入的动态数组:在X的带参构造函数中,已经执行了delete[]v;,所以当创建pa2指向的X对象时,传入的new float[3]{...}分配的数组,在构造函数执行过程中就被释放了。
    • 对象内的vector数组:如前所述,析构函数会调用delete[]this->vector;完成这块内存的释放。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 18:50:27