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;完成这块内存的释放。
- 构造时传入的动态数组:在X的带参构造函数中,已经执行了
内容的提问来源于stack exchange,提问作者decrepitude
相关产品推荐
相关产品推荐

