プログラムは:
#include <stdio.h>
struct foo
{
void blah() {printf("blah\n");}
int i;
};
void main(int, char**)
{
((foo*)NULL)->blah();
}
blah
あなたが知っているコンパイラで、クラッシュしたり、 output 以外のことをしたりしたことがありますか? メンバー (vtable を含む) にアクセスしない場合、NULL ポインターを介して呼び出されたときに関数がクラッシュしますか?
このトピックについては他にも質問がありました。たとえば、NULL ポインターでクラス メンバーにアクセスすることや、ヌル ポインターを介してメンバーにアクセスしない非静的メソッドを呼び出すことは合法的/適切に定義された C++ ですか? 、これにより未定義の動作が発生することが常に指摘されています。しかし、これは現実の世界では未定義ですか、それとも標準の世界だけですか? 期待どおりに動作しない既存のコンパイラはありますか? 将来のコンパイラが期待どおりに動作しないもっともらしい理由を思いつきますか?
関数がメンバーを変更するが、NULL ptr が保護されている場合はどうでしょうか。例えば、
void foo::blah()
{
foo* pThis = this ? this : new foo();
pThis->i++;
}
編集:記録のために、私がこれを望んだ理由は、リンクリストクラスへのインターフェースをできるだけ簡単かつ簡潔にすることでした。リストを NULL に初期化したいのですが、慣用的な使い方は次のようになります。
pList = pList->Insert(elt);
pList = pList->Remove(elt);
...
すべての演算子が新しい head 要素を返す場所。どういうわけか、コンテナー クラスを使用すると、マイナス面がなく、物事がさらに簡単になることに気づきませんでした。