【问题标题】:Why is the destructor called more than the constructor? [duplicate]为什么调用析构函数的次数多于构造函数? [复制]
【发布时间】:2015-01-03 04:33:08
【问题描述】:

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

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

【问题讨论】:

  • 你错过了复制构造函数CFoo(const CFoo&amp;)

标签: c++ destructor


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2015-04-28
    • 2018-08-14
    • 2021-04-01
    • 2022-07-05
    • 2021-05-14
    • 1970-01-01
    • 2020-01-14
    • 2013-04-17
    • 1970-01-01
    相关资源
    最近更新 更多