返回 C++ 中的局部变量

Kev*_*vin 1 c++ return local-variables

我遇到了 C++ 问题(或缺少问题),因为这段代码可以工作,但我不知道为什么。

对于上下文,我的教授给了我们一个头文件和一个主函数,该程序生成一个斐波那数列。

我正在使用迭代器使用 ++a 和 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;
}
Run Code Online (Sandbox Code Playgroud)

现在,我通过使用指针“this”的取消引用运算符创建一个值“old”。我对当前迭代器执行一些逻辑,然后返回旧迭代器。

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

FibonacciIterator lIterator2 = lIterator.begin();
do
{
    cout << *lIterator2++ << endl;
} while (lIterator2 != lIterator2.end());
Run Code Online (Sandbox Code Playgroud)

一切正常。这个 do-while 循环是教授写的,我们不打算改变它。

我的问题是,为什么这段代码有效?据我了解,当我们在方法中创建局部变量时,该变量会被封装在方法堆栈框架内。当我们退出堆栈帧时,如果我们返回在该堆栈帧中创建的局部变量,我们可能会得到我们的值。我们也可能不会。我的理解是,这是因为创建该变量的内存位置现在可以被计算机上可能需要它的任何程序“抢占”。因此,如果我们得到了我们想要的值,那是因为还没有任何东西覆盖它。如果我们不这样做,那是因为有东西覆盖了它。

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

然而,我99%确定我的猜测是错误的,我想了解这里发生了什么。我想理解这一点,因为一方面,我喜欢 C++,但我不喜欢不知道某些东西为什么有效。

谢谢你!

Joh*_*136 5

您可以返回一个本地对象 - 它将被复制。您不应该返回指向本地对象的指针。正如您正确指出的那样,指针将指向垃圾。

在你的情况下,你有一个副本,所以没关系(所有注意事项是副本必须是“安全的”)