C ++中的析构函数调用向量

use*_*413 2 c++ vector

#include <iostream>
#include <vector>

using namespace std;

class A
{
    public:
         A(){cout<<"A Contruction"<<endl;}
        ~A(){cout<<"A destruction"<<endl;}
};

int main()
{
    vector<A> t;
    A a;
    A b;
    t.push_back(a);
    t.push_back(b);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

A Contruction
A Contruction
A destruction
A destruction
A destruction
A destruction
A destruction
Run Code Online (Sandbox Code Playgroud)

无法理解销毁电话。前两个销毁是针对在向量中调用的复制构造函数。

Sam*_*hik 5

其他三个破坏来自复制和/或移动构造的对象。

这两个调用push_back将有效地在容器本身中复制构造参数对象的副本。

对的第二次调用push_back似乎是重新分配了向量以及向量中的唯一对象,从而也对其进行了复制构造,然后销毁了原始对象。

将复制构造函数添加到您的类中,以记录复制构造函数的调用。

PS实际上,如果您要深入研究这一点,那么第二和第三条“破坏”消息将记录您ab对象的破坏。第一个“破坏”消息是由于向量重新分配造成的。