当我在函数内创建一个对象时,它应该在函数存在时自动删除。例如当getFoo()退出时,应自动删除对象F.但是,当我们调用getFoo时,我们仍然可以访问F.怎么样?
Foo getFoo()
{ Foo F;
return F;
}
答案 0 :(得分:5)
您没有访问在函数内创建的对象。在从函数返回之前,在堆栈上进行复制。当然,函数范围内创建的对象在函数返回时被销毁。通过销毁,我的意思是它所在的堆栈上的位置不再有效。
答案 1 :(得分:1)
将对象复制到调用者。
理论上以下代码
Foo a = getFoo();
更有趣的是这个
Foo b;
b = getFoo();
值得庆幸的是现代编译器支持返回值优化以防止这种情况。 这也是关于代码优化的“似乎”咒语的极少数例外之一。
您可以使用此示例代码使用您最喜爱的debuger进行测试(提示:请注意对象的地址):
struct A {
A() {
i = 0;
}
A(const A& o) {
i = o.i;
}
A& operator=(A& o) {
i = o.i;
return *this;
}
~A() {
i = 0;
}
int i;
};
A getA() {
A a;
return a;
}
int main(){
A a = getA();
A b;
b = getA();
return 0;
}