1. ホーム
  2. c++

[解決済み] ダングリングリファレンスとは何ですか?重複

2022-02-16 18:48:49

質問

以下のプログラムでランタイムエラー(Segmentation Fault (SIGSEGV))が発生しました。

#include <iostream>
using namespace std;

int& bar()
{
    int n = 10;
    return n;
}

int main() {
    int& i = bar();
    cout<<i<<endl;
    return 0;
}

先生からは、ぶら下がり参照なので未定義の動作だと言われました。彼は正しいのでしょうか? もしそうなら、それを避けるにはどうしたらいいですか?

解決方法は?

の実行時に破棄される自動変数への参照を返しているため、確かに未定義の動作です。 bar() が完了します。

と書けば回避できます。

#include <iostream>
using namespace std;

int& bar()
{
    static int n = 10;
    return n;
}

int main() {
    int& i = bar();
    cout<<i<<endl;
    return 0;
}

この場合、静的変数 n の実行時に破棄されることはありません。 bar() が終了すると、プログラムが終了した時点で破棄されます。