为什么析构函数被调用的次数比构造函数多?

Why is the destructor called more than the constructor?

在下面的代码中,析构函数被调用了两次,而构造函数只被调用了一次:

enum TFoo
{
    VAL1,
    VAL2
};

class CFoo
{

public:
    TFoo mf;

    CFoo()
    {
        cout<<"hi c'tor1\n";
        //mf = f;
    }
    CFoo(TFoo f)
    {
        cout<<"hi c'tor2\n";
        mf = f;
    }
    CFoo(TFoo &f)
    {
        cout<<"hi c'tor3\n";
        mf = f;
    }
    ~CFoo()
    {
        cout<<"bye\n";
    }
};

int main()
{
    vector<CFoo> v;
    //v.assign(1, VAL1);
    v.push_back(VAL1);
}

代码输出:

hi c'tor2
bye
bye

我发现了一个类似的question,其中提到了复制构造函数,所以我添加了它们,但结果相同。取消注释行 //v.assign(1, VAL1); 也不会改变任何内容。

它最初是使用TFooCFooCFoo(TFoo f)之间的隐式转换运算符构造,然后使用该临时对象将其传递给push_back来构造容器中的对象使用默认的复制构造函数或移动构造函数,具体取决于您是否使用 C++11(不显示任何内容)。然后销毁临时对象,最后销毁容器中的对象(与容器本身一起)。

你可以看到它 here or here (C++11) 甚至更好。