【解決方法】次のコードのエラーは何ですか?


C++
int *getNum()
{
int wholeNum;
cout << "Enter a number: ";
cin >> wholeNum;
return &wholeNum;
}

私が試したこと:

C++
int getNum()
{
int wholeNum;
cout << "Enter a number: ";
cin >> wholeNum;
return &wholeNum;
}

解決策 1

問題は、戻り行で、wholenum の割り当てが解除され、これ以上存在しないことです。
したがって、返送先住所には不明な値が含まれています。
最も簡単な解決策は、int を直接返すことです

C++
int getNum()
{
int wholeNum;
cout << "Enter a number: ";
cin >> wholeNum;
return &wholeNum;
return wholeNum;
}

解決策 2

パトリスが正しく言ったことに追加するために、これは「ダングリング参照」と呼ばれ、メモリにはさまざまな「タイプ」があるために呼び出されます。
1) 関数の外部で変数を作成すると、コンパイル時に割り当てられるグローバル メモリ。
2) new または malloc / calloc を使用してコードの実行中に割り当てるヒープ メモリ
3) 関数を呼び出すときに動的に使用されるスタック メモリ。

関数を呼び出すと、その戻りアドレスがスタックにプッシュされ、関数が使用するすべての変数にもスタック上のスペースが割り当てられます。
関数が戻ると、変数のメモリが解放され、戻りアドレスがスタックからポップされ、そこからコードが続行されます。
別の関数を呼び出すと、同じことが起こり、同じスタック メモリ スペースが新しい関数情報で上書きされます。これが再帰を機能させる理由です。関数を再帰的に呼び出すたびに、スタック上で新しいスペースがその変数のために使用され、差出人住所。

しかし、スタックベースの変数のアドレスを返す場合、それは問題です。アドレスは有効ですが、次に関数を呼び出したときに内容が上書きされるためです! したがって、「ぶら下がっている参照」: それは本物であり、機能しますが、実際にはもう存在しません!

パトリスが言うように、それへのポインターではなく実際の数値を返します。つまり、値のコピーが返され、ダングリング参照はありません。

整数や浮動小数点数よりも「大きい」ものを返す必要がある場合は、ヒープにスペースを割り当ててそのポインターを返す必要がありますが、作業が完了したときにそのメモリを解放する責任があるため、事態が複雑になります。プログラムでメモリ リークが発生し、結果として最終的にクラッシュします。

コメント

タイトルとURLをコピーしました