2

コンパイラの最適化により、スタック フレームが不安定になる場合があることはわかっています。したがって、私の質問は、c++ でスタック ポインターを作成し、それを別の関数に渡して、呼び出し先の同じオブジェクトを指すことが常に安全かどうかです。コンパイラの最適化により、意図しない場所を指すようになる可能性はありますか?

たとえば、これはどのコンパイラでも常に安全ですか?

int main(){
   std::ofstream f("somefile");
   foo(&f);
   return 0;
}

または、一貫した結果を得るためにヒープを使用する必要があります。

int main(){
   std::ofstream *f=new std::ofstream("somefile");  
   foo(f);
   close(*f);
   delete f;
   return 0;
}
4

2 に答える 2

2

ブロック内で定義されたオブジェクトの有効期間は、オブジェクト定義とブロックの終わりの間でどの関数が呼び出されたかに関係なく、ブロックの終わりまで延長されます。したがって、最初の例には問題はありません。

あなたはおそらく逆のアプローチに混乱しています: 関数にローカルなオブジェクトへのポインターを返すことは安全ではありません:

std::ofstream * foo() {
  std::ofstream f("somefile");
  return &f;
}

int main() {
  std::ofstream * f = foo();
  // At this point there's no guarantee that f points to a valid object
}
于 2013-05-19T09:40:19.500 に答える