【问题标题】:Return by reference引用返回
【发布时间】:2011-01-15 17:58:07
【问题描述】:

请看下面的代码sn-ps。在第二个函数中,我返回一个引用。我在函数中声明一个局部变量并返回地址。由于变量是本地的,我相信它的生命在它退出函数时结束。我的问题是,为什么即使删除了原始变量,也可以毫无例外地访问调用者的值?

int& b=funcMulRef(20,3);

int* a= funcMul(20,3);


int* funcMul(int x,int y)
{
 int* MulRes = new int;
      *MulRes = (x*y);

 return MulRes;

}

int& funcMulRef(int x,int y)
{
 int MulRes ;
      MulRes = (x*y);

 return MulRes;

}

问候, 约翰

【问题讨论】:

  • 在funcMul上,我想你的意思是*MulRes = (x*y)
  • @Muggen。感谢您指出。现已更正。

标签: c++ pointers oop


【解决方案1】:

第二个函数的行为只是undefined;任何事情都可能发生,而且在许多情况下,它似乎会起作用,这仅仅是因为没有任何东西覆盖结果存储在堆栈中的位置。

【讨论】:

  • 为什么第一个函数不能编译?另外,+1
【解决方案2】:

您正在访问不再在范围内的数据。

内存中可能仍有数据,因此它看起来工作正常,但很可能随时被重用,并且该值将被覆盖。

下次您调用任何函数或分配本地堆栈变量时,很可能会将该内存重新用于新数据并覆盖您之前的内存。这是欠妥当的行为。

【讨论】:

    【解决方案3】:

    原始值不会被删除。只是因为删除它的动作会导致一些看不见的计算。

    值还在,但内存空间不再是你的了,实际上是未定义的。

    您指向的内存空间可能会被程序溢出。

    【讨论】:

      【解决方案4】:

      不,你不应该这样做。访问堆栈上的残差数据的结果是未定义的。除此之外,如果你的返回值是类类型,它的析构函数已经被调用了。

      您是否试图避免临时对象?如果是这样,您可能对此感兴趣:
      http://en.wikipedia.org/wiki/Return_value_optimization

      【讨论】:

        【解决方案5】:

        在这些情况下它很可能不起作用:

        funcMulRef(10,3) + funcMulRef(100,500)
        

        或者,以更讨厌的方式:

        std::cout << "10*3=" << funcMulRef(10,3) << " 100*500=" << funcMulRef(100,500) << std::endl;
        

        如果你使用 -Wall,gcc 会警告这种错误

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-11-24
          • 2010-12-03
          • 2017-12-03
          • 2013-02-02
          • 1970-01-01
          • 2015-05-05
          • 2014-03-04
          相关资源
          最近更新 更多