为什么析构函数被调用两次但构造函数只被调用一次?

时间:2013-11-26 12:21:25

标签: c++ class constructor destructor

我的代码是

class CTemp{
public:
    CTemp(){
        printf("\nIn cons");
    }
    ~CTemp(){
        printf("\nIn dest");
    }
};

void Dowork(CTemp obj)
{
    printf("\nDo work");
}

int main()
{
    CTemp * obj = new CTemp();
    Dowork(*obj);
    delete obj;
    return 0;
}

我得到的输出是

In cons
Do work
In dest
In dest

现在为什么构造函数被调用一次但析构函数被调用两次?有人可以解释一下吗?

4 个答案:

答案 0 :(得分:6)

void Dowork(CTemp obj)

这里将完成local-copy,在退出DoWork函数范围后将会破坏,这就是你看到析构函数调用的原因。

答案 1 :(得分:2)

实现复制构造函数并再次检查:

CTemp(const CTemp& rhs){
        printf("\nIn copy cons");
    }

答案 2 :(得分:0)

调用该函数时,使用隐式复制构造函数创建其参数。向您的类添加以下复制构造函数

CTemp( const CTemp & ){
    printf("\nIn ccons");
}

再看一条关于创建对象的消息

答案 3 :(得分:0)

您错过了计算复制构造函数并期望构造函数。

CTemp * obj = new CTemp(); // It will call a constructor to make
                           // a pointer to a constructed object.

Dowork(*obj);              // It will copy `*obj` to the `Dowork` and copy-
                           // constructor will be called to make the argument

所以,你有两个对象,将会调用两个析构函数。