【问题标题】:Scope of a local object [duplicate]本地对象的范围[重复]
【发布时间】:2012-06-11 10:20:04
【问题描述】:

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

这是一个示例程序,用于检查函数内本地类对象的范围。在这里,我创建了一个 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;
  }

【问题讨论】:

    标签: c++ object scope


    【解决方案1】:

    会发生什么?

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

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

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

    【讨论】:

      【解决方案2】:

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

      是的。

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

      未定义的行为。

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

      【讨论】:

      • 如果我将堆栈对象更改为指针,也会发生相同的行为。对吗??
      • @AjeshPN:如果你从函数按值返回一个动态分配的指针,那么接受返回指针的指针将指向动态内存,它会正常工作。
      • @AjeshPN:返回指向堆栈分配对象的指针是未定义行为(从技术上讲,取消引用这样的指针是发生未定义行为的地方
      【解决方案3】:

      对象将在Function() 结束时被销毁。 通过传值机制返回数据。

      【讨论】:

        【解决方案4】:

        我相信您的问题在这里得到了解答:In C++, is it safe to extend scope via a reference? 不过,它有些旧了。您可能想研究 C++11、右值引用和移动语义。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-07
          • 2013-06-05
          • 2013-06-18
          • 1970-01-01
          • 2012-10-15
          • 1970-01-01
          相关资源
          最近更新 更多