为啥析构函数被调用两次而构造函数只被调用一次?
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");
查看更多关于创建对象的消息
【讨论】:
以上是关于为啥析构函数被调用两次而构造函数只被调用一次?的主要内容,如果未能解决你的问题,请参考以下文章