本地对象的范围

时间:2012-06-07 11:02:12

标签: c++ object scope

  

可能重复:
  Can a local variable's memory be accessed outside its scope?
  return reference to local variable

这是一个用于检查函数内部本地类对象范围的示例程序。在这里,我创建了一个A类的对象并为其赋值,并在Function()中通过引用返回该对象。我想知道变量的范围何时结束?。因为它是一个堆栈对象(而不是指针),它是否会在Function()的末尾被破坏?如果是这样,当将其参考值分配给新对象时会发生什么?

  #include "stdafx.h"
  #include <iostream>

  class A
  {
  public:
    int a, b;
    A(int aa, int bb)
    {
      a = aa;
      b = bb;
    }
    A(){}
  };

  A& Function()
  {
    A object;
    object.a = 10;
    object.b = 20;
    return object;
  }

  int _tmain(int argc, _TCHAR* argv[])
  {
    A aaa = Function();
    std::cout<<"\nValue : "<<aaa.a<<" "<<aaa.b;
    getchar();
    return 0;
  }

4 个答案:

答案 0 :(得分:2)

  

因为它是一个堆栈对象(不是指针),它是否会在Function()的末尾被破坏?

  

如果是这样,当将其参考值分配给新对象时会发生什么?

未定义的行为。

如果要创建某些内容以便返回它,请按值返回。那是什么价值。

答案 1 :(得分:2)

  

会发生什么?

未定义的行为就是这样!

堆栈分配的对象是本地/自动的,因为一旦范围({})清除了这些对象的所有分配 隐式 他们住在哪里结束。

返回对本地对象的引用是一种未定义的行为 未定义的行为意味着可以看到任何行为。该程序可能会工作,也可能会崩溃或随机行为。只是它不是一个有效的c ++程序,任何事情都可能发生。

答案 2 :(得分:0)

该对象将在Function()的末尾被破坏。 通过值机制返回数据。

答案 3 :(得分:0)

我相信你的问题在这里得到解答:In C++, is it safe to extend scope via a reference? 但是,它有点旧。您可能希望查看C ++ 11,rvalue引用和移动语义。