在C ++中返回局部变量

时间:2016-04-10 11:07:01

标签: c++ return local-variables

我遇到了C ++问题(或者没有问题)因为这段代码有效,但我不知道为什么。

对于上下文,我的教授给了我们一个头文件和一个main函数,程序生成一个Fibonnaci序列。

我使用迭代器来使用++ a和a ++迭代序列。

这是我对++的实现。

FibonacciIterator FibonacciIterator::operator++(int) //i++, increment i, return old i.
{
    FibonacciIterator old = *this; //create old object to return

    //increment actual fibonacci sequence
    long nextTemp = fCurrent + fPrevious;
    fPrevious = fCurrent;
    fCurrent = nextTemp;

    fCurrentN++;  //increment count
    return old;
}

现在,我通过使用指针'这个'的解除引用运算符来创建一个值' old'。 我对当前的迭代器做了一些逻辑,并返回旧的迭代器。

这一切都有效,并使用以下do-while循环:

FibonacciIterator lIterator2 = lIterator.begin();
do
{
    cout << *lIterator2++ << endl;
} while (lIterator2 != lIterator2.end());
一切正常。这个do-while循环由教授编写,我们无意改变它。

我的问题是,为什么这段代码有效? 据我所知,当我们在方法中创建局部变量时,该变量被封装在方法堆栈框架内。 当我们退出堆栈帧时,如果我们返回在该堆栈帧中创建的局部变量,我们可能会得到我们的值。我们也可能不会。 我的理解是这是因为创建这个变量的内存位置现在是#34; up for grabs&#34;通过计算机上可能需要它的任何程序。 因此,如果我们得到我们想要的价值,那因为没有任何东西覆盖它。如果我们不这样做,那是因为有些事情已经覆盖了它。

那么为什么这段代码在100%的时间都有效呢?为什么我不会看到旧的变成垃圾,并以未处理的异常崩溃我的程序? 我唯一的猜测是因为&#39; FibonacciIterator&#39;是一个用户制作的类,它是自动在堆上分配内存,因此我们不会遇到这个问题。 我唯一的猜测是这个问题只存在于使用int,long,double等类型

然而,我99%肯定我的猜测是错误的,我想知道这里发生了什么。我想理解这一点,因为对于其中一个,我喜欢C ++,但我不喜欢不知道为什么会有效。

谢谢!

1 个答案:

答案 0 :(得分:2)

您可以返回本地对象 - 它将被复制。您无法返回指向本地对象的指针。正确指出,指针将指向垃圾。

在你的情况下,你有一份副本,所以没关系(所有注意事项都必须是#34;安全&#34;)