5

どのオブジェクトがスタックまたはメモリをいじっているのかを理解するためにコードを変更した方法に応じて、バグ、segfault、またはbad_allowを見つけようとして、おそらく3時間以上費やしました。すべてのオブジェクトを疑います。 ..クラスを虐殺しました...(それでも、これらのクラスは最終的に役に立たないことが明らかになったので、これは良いことがわかりました:-))...

しかし、実際のところ、本当の間違いは単純でした: 関数内に値を返す必要がある return ステートメントを記述していませんでした (私の場合は a を返す必要がありましたstd::vector<boost::any>)。

gcc (4.6.3)はそれなしではコンパイルできなかったと思いました。そして、 ms visual 2010で同様のことが起こったことを思い出すと、さらに奇妙に感じます。

だから今、returnステートメントを書かないのは合法かどうか疑問に思っています?? そのような場合はどうなりますか?

main が戻り値を持つことができるかどうかと関係がありますか? または、 gcc 4.7への移行を検討する必要がありますか?

4

2 に答える 2

10

それは未定義の動作です:

[C++11: 6.6.3/2]: [..]関数の最後を流れることは、return値のない a と同等です。これにより、値を返す関数で未定義の動作が発生します。

次の理由でコンパイルされます。

  1. コンパイラはそれを診断する必要はありません。
  2. これを診断することは必ずしも簡単ではないためコンパイラは気にしません。
  3. C++ は「自分でやる」言語です。
于 2013-02-24T23:01:53.107 に答える
5

フラグを使用してコンパイルすると-Wall -Wextra -pedantic、値を返す必要があるがそうしない関数に関するコンパイラ警告が表示されます。

于 2013-02-24T23:06:26.817 に答える