私はBjarne Stroustrupのフレーズをたくさん聞いたことがあります。"C++は足で自分を撃つのが難しくなりますが、そうすると足全体が離れる"と私はそれが本当にわからないそれは恐ろしいほどです。C++の最も危険な機能は何ですか?
C++でプログラミングしている最中に、あなたのソフトウェアに(あるいはもっと適切に)起こった最悪のことは何ですか?どのようにして、プレーンCというよりも危険なことがありますか?
私はBjarne Stroustrupのフレーズをたくさん聞いたことがあります。"C++は足で自分を撃つのが難しくなりますが、そうすると足全体が離れる"と私はそれが本当にわからないそれは恐ろしいほどです。C++の最も危険な機能は何ですか?
C++でプログラミングしている最中に、あなたのソフトウェアに(あるいはもっと適切に)起こった最悪のことは何ですか?どのようにして、プレーンCというよりも危険なことがありますか?
例外処理の実装は、メモリリークの容易なinroadです。
どのように?参照の代わりにポインタによってスローされた例外の場合を考えていますか? –
適切なRAIIでは、これは問題ではない、と私は思う。 –
同意しない。メモリが例外でリークする理由はありません。例外がどのように宣言されているかは、標準が非常に明確です。 –
バッファオーバーフローは、cとC++の両方で最も危険なものでなければなりません。これはMicrosoft announced that they have added memcpy() to their list of banned functions
多重継承は複雑な型のための演算子を上書きする機能はおそらく別の
オーバーランプロテクションなしで最も危険なものです。 – Skurmedel
Cには存在しないC++の最も危険な側面であることも理由です。例えば、減算を加えることは非常に簡単です(逆もまた同様です)。
だれでもだれでもをすればすることができますが、できます。危険なものにする。
仮想デストラクタの要件は、新しい方が見逃しやすい(私はほとんどのコンパイラがこれを指摘するのに十分スマートだとは思うが)。
どのような仮想デストラクタ要件? – ralphtheninja
@Magnus:ベース(または祖先)へのポインタを介してオブジェクトを破壊すると、デストラクタが仮想でない場合、間違ったデストラクタが呼び出されます。したがって、オーバーライドされるように設計されたクラスはおそらく仮想デストラクタを持つべきです。 –
Operator overloading。何が起こっているのかを理解することが非常に簡単です。経験豊富なC++開発者であっても、過負荷が起こっているという事実を見落とすのは簡単です。
オーバーロードされた演算子がその役割を果たします。私はこの機能が本質的に悪いとは言っていません。それは、人々が困難を直感的に反撃するように定義することから始まります。オーバーロードされた演算子は、適切に使用されると、コードをよりシンプルかつクリーンにすることができます。 –
C++とCの安全性を比較しようとするなら、あなたはその言葉の要点を見逃しています。おそらくC++はC言語より安全ではありません。
本当に比較できるのは、Javaなどの言語です。本質的に、Javaはあなたのためにあなたのメモリを扱うので、あなたのプログラムが現在使っているメモリの外でメモリを呼び出すときには未定義の動作に終わらないでしょう(配列の境界を越えるなど)。
あなたの質問に対処するために、私に起こった最悪の事は自分自身のパスワードを上書きするバッファオーバーフローでした(私は意図的にそれをやった)。
私はいつもその引用について不思議でした。私はC++がどのような場合にはC.
よりより危険である任意の方法を考えることはできません、私が最も危険な「機能」が割り当てられていないメモリにアクセスするからあなたを停止するには何もないということであると言っています。デバッグがほとんど不可能で、あらゆる種類のランダムな動作がクラッシュから何も起こらず、奇妙な動作に変わるエラーです。
私はこのをコンストラクタの別のオブジェクトのヘルパー関数に渡しました。ヘルパー関数は、ポインタを維持していたオブジェクトのリストに追加しました。もちろん、コンストラクタが終了して返された後、オブジェクトはメモリ内の非常に異なる場所に配置され、他のオブジェクトに格納されたポインタはもはや有効ではありませんでした。 Yikes!
それは本当ですか? : - | – fortran
"this"をコンストラクタから漏らすことは決して安全ではありません。特に、マルチスレッド環境ではなく、オブジェクトが部分的に構築されているか部分的にしか見えない場合があります。コンストラクタが返されるまでオブジェクトは完全に構築されていると仮定することはできません(これはJavaとC#でも当てはまります)。 –
あなたはバグがあったようです。 –
を実装していない場合は自動型変換を言います。 C++では、自動型変換により、直感的ではない方法で一時変数を作成できます。
あなたが行っていることを認識するたびに、危険はありません。猿の手の中の銃はいつもトラブルにつながります。 –
ええ、バナナの方がずっと少ないです。 –
私はあなたに答えはしませんが、私はこれまで話題で聞いたことのある最も記憶に残ったアドバイスをお伝えします。つまり、「例外を逃すのを忘れた場合、アプリケーション全体が終了します!」なんらかの理由で、その時私にはかなり不愉快に聞こえました。 –