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

数组元素赋值时析构函数未额外调用?为何析构次数不是4次?

为什么C++数组赋值操作没有触发额外的析构函数调用?

首先看你的代码示例:

#include <iostream>
using namespace std;

class A
{
public:
   A()
  {
       cout<<"ctor called"<<endl;
  }

  ~A()
  {
       cout<<"Destructor called"<<endl;
  }

  A& operator=(const A &a)
  {
       cout<<"Copy assignment operator called"<<endl;
       return *this;
  }
};

int main()
{
    A a;
    A aa[2];
    aa[0] = a;
}

核心结论

析构函数确实只会调用3次,你的预期有误,原因如下:

  • 构造次数的由来:A a;调用1次默认构造函数,A aa[2];为数组的两个元素各调用1次默认构造,总共创建了3个合法对象。
  • 赋值操作不触发析构:aa[0] = a;执行的是拷贝赋值运算符,这个操作的作用是把已存在的对象a的状态(你的代码里没实际拷贝数据,但语法逻辑一致)覆盖到已经创建好的aa[0]对象上。整个过程中,aa[0]从未被销毁,自然不会触发析构函数。
  • 析构次数的由来:程序结束时,所有已创建的3个对象(a、aa[0]、aa[1])会依次被销毁,每个对象对应一次析构函数调用,所以总共是3次。

额外说明

如果你的代码是aa[0] = A();这种形式,赋值右侧是临时对象,那么临时对象在赋值完成后会被销毁,此时析构函数会调用4次(3个原有对象+1个临时对象)。但你的代码中赋值的是已存在的a对象,没有临时对象产生,所以不会多一次析构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 19:25:29