在 C++ 中返回局部变量
Returning a local variable in C++
我遇到了 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;
}
现在,我通过使用指针 'this' 的解引用运算符创建一个值 'old'。
我对当前迭代器和 return 旧迭代器做了一些逻辑处理。
一切正常,并使用以下 do-while 循环:
FibonacciIterator lIterator2 = lIterator.begin();
do
{
cout << *lIterator2++ << endl;
} while (lIterator2 != lIterator2.end());
一切正常。这个do-while循环是教授写的,我们不打算更改它。
我的问题是,为什么这段代码有效?
据我了解,当我们在方法中创建局部变量时,该变量被封装在方法堆栈框架中。
当我们退出栈帧时,如果我们 return 一个在该栈帧中创建的局部变量,我们可能会得到我们的值。我们也可能不会。
我的理解是,这是因为创建此变量的内存位置现在已被计算机上可能需要它的任何程序 "up for grabs"。
所以如果我们得到了我们想要的值,那是因为还没有任何东西覆盖它。如果我们不这样做,那是因为有东西覆盖了它。
那么为什么这段代码 100% 有效?为什么有时我看不到旧的变成垃圾,并且我的程序因未处理的异常而崩溃?
我唯一的猜测是因为 'FibonacciIterator' 是用户创建的 class,它是在堆上自动分配的内存,因此我们不会 运行 进入这个问题。
我唯一的猜测是,这个问题只存在于使用 int、long、double 等类型时
不过,我99%确定我的猜测是错误的,我想了解这里到底发生了什么。我想了解这一点,因为一方面,我喜欢 C++,但我不喜欢不知道为什么会起作用。
谢谢!
您可以 return 本地对象 - 它将被复制。您不应该 return 指向本地对象的指针。正如您正确指出的那样,指针将指向垃圾。
在你的情况下,你有一份副本,所以没关系(注意副本必须是 "safe")
我遇到了 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;
}
现在,我通过使用指针 'this' 的解引用运算符创建一个值 'old'。 我对当前迭代器和 return 旧迭代器做了一些逻辑处理。
一切正常,并使用以下 do-while 循环:
FibonacciIterator lIterator2 = lIterator.begin();
do
{
cout << *lIterator2++ << endl;
} while (lIterator2 != lIterator2.end());
一切正常。这个do-while循环是教授写的,我们不打算更改它。
我的问题是,为什么这段代码有效? 据我了解,当我们在方法中创建局部变量时,该变量被封装在方法堆栈框架中。 当我们退出栈帧时,如果我们 return 一个在该栈帧中创建的局部变量,我们可能会得到我们的值。我们也可能不会。 我的理解是,这是因为创建此变量的内存位置现在已被计算机上可能需要它的任何程序 "up for grabs"。 所以如果我们得到了我们想要的值,那是因为还没有任何东西覆盖它。如果我们不这样做,那是因为有东西覆盖了它。
那么为什么这段代码 100% 有效?为什么有时我看不到旧的变成垃圾,并且我的程序因未处理的异常而崩溃? 我唯一的猜测是因为 'FibonacciIterator' 是用户创建的 class,它是在堆上自动分配的内存,因此我们不会 运行 进入这个问题。 我唯一的猜测是,这个问题只存在于使用 int、long、double 等类型时
不过,我99%确定我的猜测是错误的,我想了解这里到底发生了什么。我想了解这一点,因为一方面,我喜欢 C++,但我不喜欢不知道为什么会起作用。
谢谢!
您可以 return 本地对象 - 它将被复制。您不应该 return 指向本地对象的指针。正如您正确指出的那样,指针将指向垃圾。
在你的情况下,你有一份副本,所以没关系(注意副本必须是 "safe")