求助关于析构函数问题

lywei 2011-09-21 05:09:24
代码如下
#include <iostream>
using namespace std;
class human
{
public:
human(){ human_num++;};
static int human_num;
~human()
{
human_num--;
print();
}
void print() //
{
cout<<"human num is: "<<human_num<<endl;
}

protected:
private:
};
int human::human_num = 0;

human f1(human x)
{
x.print();
return x;
}

int main(int argc, char* argv[])
{
human h1;
h1.print();
h1=f1(h1);
human h2 = h1;
h2.print();
return 0;
}


请问h1=f(h1)为什么有两次析构?
下面那个就只有一次
...全文
113 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
就想叫yoko 2011-09-22
  • 打赏
  • 举报
回复
google C++ NRV优化
taodm 2011-09-21
  • 打赏
  • 举报
回复
楼主知不知道什么叫“临时变量”啊?
human h2= f1(h1)只调1次,是因为“优化”,c++标准少有的几个明确谈到优化的地方之一。
lywei 2011-09-21
  • 打赏
  • 举报
回复
要沉下去了,自己顶上去吧,具体问题见8楼
lywei 2011-09-21
  • 打赏
  • 举报
回复
human h2= f1(h1)


只调用复制构造函数,不调用operator=
human h2;
h2= f1(h1)

多调用一次operator=,所以多一次析构,请问为什么?
stendson 2011-09-21
  • 打赏
  • 举报
回复
h2=f1(h1)先拷贝实参h1形成副本(临时对象)赋给形参x,x作用域在函数f1内,f1返回时调用x临时对象的析构(第一次析构),将临时对象赋给h2,编译器检查h2是否存在,若存在删除之(第二次析构),否则就调用x的拷贝构造赋给h2.
h2存在 两次析构
h2不存在 一次析构
lywei 2011-09-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 q191201771 的回复:]
f1函数的参数x需要释放
f1返回值这个临时变量还要释放一次
[/Quote]
按照你的说法,以上两种不应该有区别的啊
lywei 2011-09-21
  • 打赏
  • 举报
回复
human h2= f1(h1)

这样子只析构一次
human h2;
h2= f1(h1)

析构两次
就想叫yoko 2011-09-21
  • 打赏
  • 举报
回复
也是2次
一样的[Quote=引用 3 楼 lyweilyyan 的回复:]

可是h2=f1(h1);析构一次啊
[/Quote]
lywei 2011-09-21
  • 打赏
  • 举报
回复
可是h2=f1(h1);析构一次啊
turing-complete 2011-09-21
  • 打赏
  • 举报
回复
构造了两次
就想叫yoko 2011-09-21
  • 打赏
  • 举报
回复
f1函数的参数x需要释放
f1返回值这个临时变量还要释放一次

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧