2

cout がバス/セグメンテーション エラーでどのように機能するかについて興味があります。以下に2つの例を貼り付けました。バス エラーを複製する方法がわからないため、この例では、grid.DoMovement がバス エラーをスローした場合に対処する必要があります。バス エラー行の前に何かを出力しているときに、endline を挿入すると正常に出力されることに気付きましたが、endl を挿入しないと出力されません。一番下の例は、私の言いたいことを示しています。
cout に endline を配置せず、後の行の 1 つでバス エラーが発生した場合、「例 2」が出力されないのはなぜですか?

例 1:

std::cout << "example 1" << endl;
grid.DoMovement(); 

出力は

works
bus error

例 2:

std::out << "example 2";
grid.DoMovement(); 

出力は

bus error
4

4 に答える 4

4

デフォルトでは、IOStream はバッファリングされます。バッファに書き込まれただけのものは表示されません。ストリームで使用するstd::endlと、改行が追加され、ストリームがフラッシュされます。通常、ストリームをフラッシュしたくないことに注意してください。flie ストリームを頻繁にフラッシュすると、パフォーマンスが大幅に低下する可能性があります。したがって、改行std::endlが必要な場合は使用しないことをお勧めします。'\n'本当にストリームをフラッシュしたい場合は、ストリームをフラッシュするstd::flushだけを明示的に使用できます。

デバッグ中は、クラッシュによって出力の表示が妨げられないように、すべての出力が書き込まれるとすぐに表示されると便利な場合があります。上記のアドバイスに従い、頻繁にフラッシュしないと、多くの出力がバッファリングされる可能性があります。これに対する簡単な解決策は、 を使用することstd::unitbufです。このマニピュレータはフラグをオンにして、std::ios_base::unitbuf各挿入後に出力ストリームをフラッシュします。std::nounitbuf動作することがわかっている (または、少なくとも劇的な方法で失敗しないことがわかっている) コード セクションでのスローダウンを回避するために、フラグを再びオフにすることができます。

std::cout << std::unitbuf;   // turn on automatic flushing
problematic_code();
std::cout << std::nounitbuf; // turn off automatic flushing

のデフォルト設定は、とstd::ios_base::unitbufの違いです。どちらのストリームも標準エラー ストリーム (UNIX ファイル記述子 2 の場合) に書き込みますが、各書き込み後にバッファをフラッシュしませんが、そうではありません。std::cerrstd::clogstd::cerrstd::clog

于 2012-10-11T18:47:08.937 に答える
4

std::endlストリームに新しい行を追加するだけでなく、出力ストリームの現在のバッファもフラッシュします。一部のデータが出力ストリーム バッファーにあるときにバス エラーが発生した場合、そのデータは表示されません。

于 2012-10-11T18:07:36.773 に答える
1

std::coutそうでない場合はバッファリングされstd::cerrます。std::cerrを使用して、または使用せずにテストすると、std::endlメッセージが表示されます。

http://www.cplusplus.com/reference/iostream/manipulators/endl

于 2012-10-11T18:07:33.437 に答える
1

endl改行文字を出力し、出力バッファをフラッシュする「魔法の」マニピュレータです。

バッファーは通常、プログラムの終了時にもフラッシュされるため、通常、追加の効果は見られませんendl。しかし、その後すぐにプログラムがクラッシュした場合、バッファーはフラッシュされず、出力は表示されません。

2番目の例を次のように変更できます

std::out << "example 2" << flush;

フラッシングの効果を見る。

于 2012-10-11T18:08:11.080 に答える