为啥析构函数被调用两次而构造函数只被调用一次?

Posted

技术标签:

【中文标题】为啥析构函数被调用两次而构造函数只被调用一次?【英文标题】:Why is the destructor getting called twice but the constructor only once?为什么析构函数被调用两次而构造函数只被调用一次? 【发布时间】:2013-11-26 12:21:24 【问题描述】:

我的代码是

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

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

【问题讨论】:

【参考方案1】:
void Dowork(CTemp obj)

这里将完成本地复制,在退出DoWork 函数的范围后将被破坏,这就是你看到析构函数调用的原因。

【讨论】:

所以这意味着在这种情况下复制构造函数被调用? @singh 是的。将调用默认实现的复制 c-tor。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

当函数被调用时,它的参数是使用隐式复制构造函数创建的。将以下复制构造函数添加到您的类中

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

查看更多关于创建对象的消息

【讨论】:

以上是关于为啥析构函数被调用两次而构造函数只被调用一次?的主要内容,如果未能解决你的问题,请参考以下文章

为啥构造函数被调用两次

C++不是说虚基类构造函数只被调用一次吗?

为啥自动对象的析构函数被调用两次?

如何确保 std::call_once 真的只被调用一次

tomcat服务器启动,Filter 的构造函数被调用了两次,doFilter函数调用了一次,

构造函数 析构函数