C++创建vector数组时析构函数提前调用的原因咨询
问题:vector构造阶段为何提前触发析构函数?
以下是编译运行的C++代码(使用gcc 9.5.0版本编译):
#include<iostream> #include<vector> class Students { int *arr_roll; public: Students (size_t a){ arr_roll = new int(a); } ~Students(){ std::cout<<"Destructor called"<<std::endl; //delete arr_roll; } int & operator [] (size_t t){ return arr_roll[t]; } }; int main(){ std::vector<Students> School(10,5); School[0][1] = 2; std::cout<< "School[0][1]: " << School[0][1]<<std::endl; return 0; }
运行后输出:
**Destructor called** School[0][1]: 2 Destructor called Destructor called Destructor called Destructor called Destructor called Destructor called Destructor called Destructor called Destructor called Destructor called
请问为何在创建vector(即执行std::vector<Students> School(10,5);语句)阶段会触发第一个标注**的析构函数调用?
解答
这是因为你调用的是vector的填充构造函数,它的执行逻辑如下:
- 首先,用传入的参数
5构造一个临时的Students对象,作为后续复制的模板。 - 接着,vector会在自身内存空间中,复制构造出10个
Students对象。 - 临时模板对象完成复制使命后就会被销毁,这就触发了你看到的第一个析构函数调用。
另外需要注意,你的Students类存在严重缺陷:没有自定义拷贝构造函数。编译器自动生成的默认拷贝构造函数只会浅复制指针arr_roll,导致vector中所有Students对象共享同一块堆内存。一旦取消注释析构函数里的delete arr_roll,程序会触发重复释放内存的未定义行为,大概率会崩溃。
内容的提问来源于stack exchange,提问作者Debabrata Bardhan
相关产品推荐
相关产品推荐

