特定のメンバーで==
演算子をオーバーロードしたクラスがあります。memcmp()
コードで行われた不適切なコピー (memcpy
本来よりも大きなサイズで呼び出された) が原因で、オペレーターを呼び出すときにセグメンテーション違反が発生しました==
。
UB が神秘的で明らかに定義されていないことは理解していますが、それでも気になる点があります。
デバッグ中に、==
呼び出しをその実装と交換しました (つまり、a==b
と交換しましたmemcmp(a.member_x, b.member_x, SIZE)
)。セグメンテーション違反はありません!
では、オペレーター自体を使用することと、それを実装に置き換えることの間に違いはありますか、それともこれは単に UB ですか?
明確にするために: はい、このコードには UB が含まれています。それは悪いことであり、その結果は未定義です。私が知りたいのは、オペレーターを呼び出したり、本体を呼び出したりすると、何か違うことが起こりますか? UBは、違いが存在する可能性があると私に思わせました(そして明らかに修正されました)