上級 › ローカル変数への参照を返すとSegmentation faultになる原因 › パターン3
ローカル変数への参照を返すとSegmentation faultになる原因
関数のローカル変数への参照を関数の外に返してしまうバグです。
1 #include <iostream> 2 int& makeId() { 3 __________ id = 7; ^ 4 return id; 5 } 6 int overwrite() { 7 int stack_data[8] = {0,0,0,0,0,0,0,0}; 8 return stack_data[0]; 9 } 10 int main() { 11 int& id = makeId(); 12 overwrite(); 13 std::cout << id << std::endl; 14 return 0; 15 }
Segmentation fault
空欄を埋めてコンパイル・実行を通す
「関数を抜けてもすぐ上書きされなければ値は読める」という考えは危険です。別の関数呼び出しが挟まるだけで、同じスタック領域が再利用され壊れます。ローカル変数をstaticにすれば関数を抜けても実体が破棄されません。
次の問題