以下代码使用修改的析构函数i.当析构函数运行时,2应该存储到我们观察到的返回i时.thing()-1
#include <stdio.h>
class Destruct {
int &i;
public:
Destruct(int &_i) : i(_i) {}
~Destruct() {
i = 2;
}
};
int thing() {
int i = -1;
Destruct d(i);
return i;
}
int main() {
printf("i: %d\n", thing());
}
Run Code Online (Sandbox Code Playgroud)
Naw*_*waz 12
int thing() {
int i = -1;
Destruct d(i);
return i;
}
Run Code Online (Sandbox Code Playgroud)
d函数返回时对象被破坏,堆栈清理开始!到调用析构函数时,返回的值已经复制到返回寄存器.
通过这样做可以看出你想看到的东西:
int thing() {
int i = -1;
{
Destruct d(i); //put it inside braces!
}
return i;
}
Run Code Online (Sandbox Code Playgroud)
来自你的评论:
这就是它的工作原理,代码的反汇编表明情况就是这样.我很好奇为什么.
逻辑是直截了当的,它可以用这种方式证明:假设析构函数在i被复制到返回寄存器之前被调用,那么为什么选择性地销毁d而不是i呢?毕竟两者都是局部变量.如果d被破坏,那么在将其值复制到返回寄存器之前i也应该被破坏,但这没有意义.
正如@Luc Touraille(在评论中)所说的那样:"如果你的功能恢复了d怎么办?你确定你想在被传递给来电者之前被d破坏吗?"