返回在函数内创建的obejct

时间:2016-09-30 14:52:46

标签: c++ visual-c++

当我在函数内创建一个对象时,它应该在函数存在时自动删除。例如当getFoo()退出时,应自动删除对象F.但是,当我们调用getFoo时,我们仍然可以访问F.怎么样?

     Foo getFoo()
     {    Foo F;
          return F;
     }

2 个答案:

答案 0 :(得分:5)

您没有访问在函数内创建的对象。在从函数返回之前,在堆栈上进行复制。当然,函数范围内创建的对象在函数返回时被销毁。通过销毁,我的意思是它所在的堆栈上的位置不再有效。

答案 1 :(得分:1)

将对象复制到调用者。

理论上以下代码

Foo a = getFoo();
  • 调用函数
  • F构建
  • a是从F
  • 复制构造的
  • F被销毁

更有趣的是这个

Foo b;
b = getFoo();
  • b构建
  • 调用函数
  • F构建
  • 未命名的临时对象(temp)是从F
  • 复制构造的
  • F被销毁
  • 赋值运算符从temp调用到b
  • temp被摧毁。

值得庆幸的是现代编译器支持返回值优化以防止这种情况。 这也是关于代码优化的“似乎”咒语的极少数例外之一。

您可以使用此示例代码使用您最喜爱的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;
}