我遇到C ++问题(或缺少C ++问题),因为此代码有效,但我不知道为什么。
对于上下文,我的教授给了我们一个头文件和一个主要功能,该程序生成一个Fibonnaci序列。
我正在使用迭代器使用++ 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”。我对当前的迭代器执行一些逻辑,然后返回旧的迭代器。
所有这些都有效,并使用以下do-while循环:
FibonacciIterator lIterator2 = lIterator.begin();
do
{
cout << *lIterator2++ << endl;
} while (lIterator2 != lIterator2.end());
一切正常。这种do-while循环是由教授编写的,我们无意更改它。
我的问题是,为什么此代码有效?据我了解,当我们在方法中创建局部变量时,该变量被封装在方法堆栈框架中。当我们退出堆栈框架时,如果我们返回在该堆栈框架中创建的局部变量,我们可能会得到我们的值。我们也可能不会。我的理解是,这是因为创建此变量的内存位置现在已被计算机上可能需要该程序的任何程序“抢走”。因此,如果我们获得了所需的价值,那是因为还没有任何东西覆盖它。如果我们不这样做,那是因为某些东西已经覆盖了它。
那么,为什么此代码在100%的时间内有效呢?为什么有时我看不到旧的东西变成垃圾,并以未处理的异常使我的程序崩溃?我唯一的猜测是,由于“ FibonacciIterator”是用户制作的类,因此它是在堆上自动分配的内存,因此我们不会遇到此问题。我唯一的猜测是,此问题仅在使用int,long,double等类型时存在。
但是,我99%确信我的猜测是错误的,并且我想了解这里的情况。我想了解这一点,因为我喜欢C ++,但是我不喜欢不知道为什么某些东西会起作用。
谢谢!
您可以返回一个本地对象-该对象将被复制。您不应该返回指向本地对象的指针。如您正确指出的那样,指针将指向垃圾。
在您的情况下,您有一份副本,这样就可以了(所有警告请注意,副本必须是“安全”的)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句