0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【C++】参照の挙動

Posted at

参照の挙動について

sample.cpp
int sum(int a, int b)
{
     return a+b;
}

int& temp()
{
     return sum(0, 1);
}

int& work()
{
     return temp();
}

こういう参照を返すコードがあったとしましょう。

sample.cpp
int main()
{
     std::cout << " sum : " << sum(0, 1) << std::endl;
     std::cout << "temp : " << temp() << std::endl;
     std::cout << "work : " << work() << std::endl;

     return 0;
}

このコードは、コンパイルは通ります。
しかし、実行時におかしな挙動をします。

1つ目のsumは、ただ値を返しているだけなので、何も問題はありません。

2つ目のtempも、sumで足し算した値を参照で返しているだけです。
3つ目のworkも、sumで足し算して返された値の参照を参照して(?)返しているだけです。

しかし、C++の参照において、classやstructのメンバなど寿命が長いモノは問題ないのですが、どこかに作られているわけでもないローカル変数(関数の戻り値も含む)を参照で返すのは、非常に危険です。

なぜかというと、ローカル変数がいつ消えてしまうのか予測しづらいからだと思います。

一度だけローカル変数を参照するのは問題なく動きました。(環境やC++のバージョン、コンパイラによって異なるかもしれません)

上記コードのように奥深くから参照を繰り返すと、2~3回参照したあたりで原初のローカル変数がお亡くなりになってしまうのか、初期化していないローカル変数を出力した時などに似ている不定値が返ってきてしまいました。

1
1
// 何らかの不定値
0
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?