C++关于函数调用里变量寿命的问题

[复制链接]
查看11 | 回复5 | 2013-2-18 16:37:17 | 显示全部楼层 |阅读模式
返回值为string类型,会调用sting类中的复制构造函数,将temp复制过去用于保存的。 原因很简单,内置类型比如int char 等,可以直接用eax寄存器保存,做为函数的返回值,当返回值为自定义类型时, 一个寄存器是无法保存的, 所以像你的代码,在version()的调用代码执行前,总会有一段string构造函数的调用代码(汇编器实现),当函数返回时,有复制构造函数将返回值保存到开辟的空间中。欢迎来0x30帖吧,讨论更多计算机相关的知识。...
回复

使用道具 举报

千问 | 2013-2-18 16:37:17 | 显示全部楼层
这个没什么不对啊,return 回来的temp只是一个临时变量,函数version调用结束后,temp确实被释放了,但是return回来的临时变量已经赋给了result,在赋值过程中编译器只是把右值内存上的值存起来,然后放入左值的内存中,之后右值的释放与否不会影响到左值。当然如果返回的是临时变量的指针或者引用就不对了,因为函数调用结束后,临时变量被释放,左值...
回复

使用道具 举报

千问 | 2013-2-18 16:37:17 | 显示全部楼层
哈,这个啊,没表面看起来那么简单。并不是你想的那样的, 这其实要看编译器的处理策略了。可能是这样,返回之后你用的result,是根据temp重新构造的一个新的对象,并不是原来的temp,这个temp已经被析构。也可能是这样,编译器改变了你的函数声明,增加了一个新的引用参数像这样void version(const string & s1, c...
回复

使用道具 举报

千问 | 2013-2-18 16:37:17 | 显示全部楼层
查看汇编代码!!!!!return temp;执行之后,析构 temp并不是代码string temp; temp = s2 + s1 + s2;后析构 temp;然后return temp;这里处理起来比较麻烦,可是这是编译器干的事情,它可以随便处理,只要结果正确就行!!!!...
回复

使用道具 举报

千问 | 2013-2-18 16:37:17 | 显示全部楼层
temp本身是被释放了 但是在被释放前编译器先做了一件事 就是对result 进行赋值 将temp的值赋值给了result 而result 自己的内存空间是一直存在的。所以输出的时候你看见的是result内存空间中保存的值而不是temp保存的。这里主要注意区分对象指向的地址和对象指向地址存放的值的区别。...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行