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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 08:32:55