1

可能重复:
可以在其范围之外访问局部变量的内存吗?
返回对局部变量的引用

这是一个示例程序,用于检查函数内本地类对象的范围。在这里,我正在创建 A 类的对象并为其赋值,并通过引用返回该对象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

4 回答 4

2

既然是栈对象(不是指针),会不会在Function()结束时被销毁?

是的。

如果是这样,当它的引用值被分配给一个新对象时会发生什么?

未定义的行为。

如果您创建某些东西是为了返回它,请按值返回它。这就是价值观的目的。

于 2012-06-07T11:04:44.033 回答
2

怎么了?

未定义的行为会发生什么!

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

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

于 2012-06-07T11:04:57.017 回答
0

我相信您的问题在这里得到了回答:在 C++ 中,通过引用扩展范围是否安全? 不过,它有些旧了。您可能想研究 C++11、右值引用和移动语义。

于 2012-06-07T11:23:33.127 回答
0

该对象将在Function(). 通过传值机制返回数据。

于 2012-06-07T11:09:36.453 回答