2016-04-10 10 views
0

このコードが機能するため、C++の問題が発生しています(またはその部分が不足しています)。C++でのローカル変数の返却

私の教授からは、ヘッダーファイルとメイン関数が与えられており、プログラムは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; 
} 

ここでは、ポインタ 'this'の逆参照演算子を使用して値 'old'を作成します。 私は現在のイテレータにいくつかのロジックを行い、古いイテレータを返します。

このすべての作品、および以下を使用して行う-whileループ:

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

すべての作品。このdo-whileループは教授によって書かれていますが、私たちはそれを変更するつもりはありません。

私の質問は、このコードはなぜ機能するのですか? 私の理解では、メソッド内でローカル変数を作成すると、その変数はメソッドスタックフレームに入れられます。 スタックフレームを終了するときに、そのスタックフレームで作成されたローカル変数を返すと、値が得られる可能性があります。我々はまたそうではないかもしれない。 これは私が理解しているのは、この変数が作成されたメモリの場所が、必要になる可能性のあるコンピュータ上のプログラムによって "上がっている"ためです。 私たちが望む価値を得るならば、それはまだそれを上書きしていないからです。もしそうでなければ、何かがそれを上書きしたからです。

なぜ、このコードは100%時間で動作するのですか?なぜ古いものがゴミとなって、処理されない例外が発生してプログラムがクラッシュするのはなぜですか? 私が推測するのは、 'FibonacciIterator'はユーザー作成のクラスであるため、ヒープ上にメモリが自動的に割り当てられているため、この問題は発生しません。 この問題は、int、long、doubleなどの型を使用する場合にのみ発生します。

しかし、99%は私の推測が間違っていると確信しています。 。私はこれを理解したいと思います。なぜなら、私はC++を楽しんでいますが、なぜ何かが機能するのを知らないのは楽しいことではありません。

ありがとうございました!

+0

(コピーは「安全」でなければならないことを、すべての警告で)OKですので、それがコピーされ、この場合の戻り値は、そのStatementの終了セミコロン(;)までスコープを持つ一時オブジェクトに格納されます。すなわち、戻り値は、cout << * lIterator2 ++ << endlの終了セミコロンまでスコープを持ちます。 –

答えて

2

ローカルオブジェクトを返すことができます。これがコピーされます。ローカルオブジェクトへのポインタを返すことはできません。正しく指摘すると、ポインタはジャンクを指します。あなたのケースでは

あなたはコピーを持っているので、それはローカル変数に値で返され

+0

私はこの場合に移動に関する情報を修正します(C++ 11と 'FibonacciIterator'の正しい移動動作を想定しています) – Zereges

関連する問題