上級 › ローカル変数への参照を返すとSegmentation faultになる原因 › パターン1
ローカル変数への参照を返すとSegmentation faultになる原因
関数のローカル変数への参照を関数の外に返してしまうバグです。
1 #include <iostream> 2 int& getRef() { 3 __________ local = 42; ^ 4 return local; 5 } 6 int noise() { 7 int junk[8] = {1,2,3,4,5,6,7,8}; 8 return junk[0]; 9 } 10 int main() { 11 int& r = getRef(); 12 noise(); 13 std::cout << r << std::endl; 14 return 0; 15 }
Segmentation fault
空欄を埋めてコンパイル・実行を通す
getRef()が返した参照は、関数を抜けた時点で破棄されたローカル変数localを指したままです。直後に別の関数noise()を呼ぶと、そのスタックフレームが同じメモリ領域を上書きするため、rを読んだ瞬間にクラッシュします。localをstaticにすればプログラム終了まで実体が残り続けるため、参照を安全に返せます。
次の問題