C++の例外の問題点

C++JavaC#と同様に例外の機構を備えていますが、JavaC#と比べてC++では例外の使用を避ける向きが多いようです。たとえば、Google C++スタイルガイドでは "We do not use C++ exceptions." とされています。これはどうしたわけでしょうか?


ひとつには、C++はコードサイズや実行速度の要求が厳しい用途に使われることが多いからでしょう。C++で例外を使用するとコードサイズが大きくなり、またオーバーヘッドが増えて処理速度が落ちます。非常に限られたリソースしか持たない組込み系や、大量のデータを高速に処理しなければならないエンジンでは、これは大きなデメリットです。


しかし、C++で例外が敬遠される理由はそれだけではありません。C++JavaC#などの現代語に多大な影響を与えた言語ですが、C言語という古代語をひきずっており、今となってはイケてない部分が多いいわば中世の言語です。例外に関してもJavaに比べて下記の点がイケてません。

  • catch忘れをコンパイル時に指摘してくれない。
  • スタックトレースが無いので、どこで発生した例外か分からない。
  • finally構文が無いので、後始末の処理がめんどう。

そして、最大の問題点は、メモリリークを起こしやすい」ことです。言うまでもありませんが、JavaC#とちがってC++GCを備えていないので、確保したメモリはプログラマーがきっちり漏れなくの解放しなければなりません。しかるに例外とは「抜け道」を作ることなのです。抜け道を作ったら漏れの危険性が高まります。GCを備えてないC++では例外の使用は慎重にしなければならないのです。


C++はそもそも何事もプログラマの自己責任に任せるアンマネージドな言語です。そして、ライブラリで対応できることはあえて言語でサポートしないという思想を持っています。上記の問題点も、ライブラリの使用で解決できる部分はあります。それらを駆使し、かつ自己責任でちゃんとメモリの管理ができるなら例外を積極的に利用して良いでしょう。逆にいうならそれが出来ないならC++では例外は使わないほうが賢明かもしれません。