13
int&  fun()
{
    int * temp = NULL;
    return *temp;
}

上記の方法では、NULL ポインターの逆参照を行おうとしています。この関数を呼び出すと、例外は発生しません。戻り値の型が参照による場合、値による場合は例外が発生しないことがわかりました。NULL ポインターの逆参照が参照に割り当てられている場合でも (以下の行のように)、それも得られません。

int* temp = NULL:
int& temp1 = *temp;

ここで私の質問は、コンパイラが参照の場合に逆参照を行わないということですか?

4

5 に答える 5

17

null ポインターの逆参照はUndefined Behaviorです。

未定義の動作とは、何でも起こり得ることを意味するため、これに対する動作を定義することはできません。

確かに、この C++ 標準の引用を追加するのは n 回目ですが、そうする必要があるようです。

未定義の動作については、

C++ 標準セクション 1.3.24 には次のように記載されています。

許容される未定義の動作は、状況を完全に無視して予測不可能な結果を​​もたらすことから、翻訳中またはプログラム実行中に、環境に特有の文書化された方法で動作すること (診断メッセージの発行の有無にかかわらず)、翻訳または実行の終了 (診断メッセージの発行を伴う) にまで及びます。診断メッセージの)。

注:
また、注意していただきたいのですが、返された参照またはローカル変数へのポインターを関数内で
使用することも、未定義の動作です。new を使用して freestore(heap) にポインターを割り当ててから、そこへの参照/ポインターを返す必要があります。

編集:
@James McNellis がコメントで適切に指摘しているように
、返されたポインターまたは参照が使用されていない場合、動作は明確に定義されています。

于 2011-07-16T07:45:06.563 に答える
7

null ポインターを逆参照する場合、必ずしも例外が発生するとは限りません。保証されているのは、動作が未定義であることだけです (これは、動作が何であるかについてまったく保証がないことを意味します)。

式が評価される*tempと、プログラムの動作について推論することは不可能です。

于 2011-07-16T07:44:35.720 に答える
4

null ポインターを逆参照することは許可されていないため、コンパイラーは、それを行わないと想定してコードを生成できます。とにかくそれを行う場合、コンパイラは親切で教えてくれるかもしれませんが、そうである必要はありません。あなたがそれをしてはならないというのは、契約のあなたの部分です。

この場合、警告レベルを適切に設定するだけで、コンパイラが問題をコンパイル時に通知してくれるはずです

于 2011-07-16T08:31:14.683 に答える