数组元素赋值时析构函数未额外调用?为何析构次数不是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
相关产品推荐
相关产品推荐

