1

特定のメンバーで==演算子をオーバーロードしたクラスがあります。memcmp()コードで行われた不適切なコピー (memcpy本来よりも大きなサイズで呼び出された) が原因で、オペレーターを呼び出すときにセグメンテーション違反が発生しました==

UB が神秘的で明らかに定義されていないことは理解していますが、それでも気になる点があります。

デバッグ中に、==呼び出しをその実装と交換しました (つまり、a==bと交換しましたmemcmp(a.member_x, b.member_x, SIZE))。セグメンテーション違反はありません!

では、オペレーター自体を使用することと、それを実装に置き換えることの間に違いはありますか、それともこれは単に UB ですか?

明確にするために: はい、このコードには UB が含まれています。それは悪いことであり、その結果は未定義です。私が知りたいのは、オペレーターを呼び出したり、本体を呼び出したりすると、何か違うことが起こりますか? UBは、違いが存在する可能性があると私に思わせました(そして明らかに修正されました)

4

1 に答える 1