为什么析构函数被调用的不仅仅是构造函数?

时间:2015-01-02 20:10:08

标签: c++ destructor

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

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);也不会改变任何内容。

1 个答案:

答案 0 :(得分:9)

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

你可以更好地看到它herehere(C ++ 11)。