2017-10-19 13 views
-1

私は参照が無効であることをチェックできるかどうかを知りたがっています。私はできると信じていますが、わかりません。これに関連して、私はまた、次のような場合には、私はポインタを「参照解除」していますかどうかを知りたい:nullまたは特定のタイプの値に対して参照をチェックすることはできますか?

struct Texture { int width; }; 

void useTexture(Texture& texture) 
{ 
    int a = texture.width; 
    //Exception thrown: read access violation. 
texture was nullptr. 
// When I hover the mouse over the argument it says "struct at null" 
} 

int main() 
{ 
    Texture* obj = nullptr; 
    useTexture(*obj); // This is using the dereference operator, 
         // but no exception is thrown here. 
} 

例外のみuseTexture()関数で発生します。この場合、関数に* obj引数を渡すと、この位置からデータを読み取っていないので、参照にアドレスを渡しているだけで、ポインタを渡すときとはまったく違う方法で推測します。だから私は逆参照演算子を使用しても、実際にポインタを逆参照しましたか?私はそうは思わない。

また、参照が有効であればuseTexture()関数をチェックインする方法があるかどうかを知りたいと思います。デバッガで、引数の上にカーソルを置くとstructがnullになり、例外がスローされるときにはtextureがnullptrであると表示されます。私は、テクスチャはポインタではなく、参照であるため、そのアドレスが0x00であるため、nullptrを言っていると仮定しています。

同様に、私がしなければ、:

Texture* obj = (Texture*)0x80; 
useTexture(*obj); 

代わりの「ヌルで構造体」と言って、それがデータを読み取ることができないと言うと、例外をスローするときには、「0x80をで不正なメモリアクセスを」と言います。これは私が理解している。

私がやりたかったのは、有効であるかどうかをチェックする機能で安全性チェックを行うことでした。人々がリファレンスをnullにすることはできないと覚えていますが、ポインタを取るために関数を変更しなければならないと思っていました。しかし、私が参照したものからはアドレスもあり、nullでもかまいません。参照がポインタ引数に変更されずに有効かどうかを確認する方法はありますか?逆参照の質問は別の質問ですが、2つの質問をしたくありませんでした。

編集:私はちょうどテスト、そして私のような何かを行うことができると思った:代わりに呼び出しサイトでnullptrをチェックする

if ((Texture*)&texture == nullptr) return; 

を。このような何か行う

答えて

1

A * a = nullptr; 
A b = * a; 

はC++で定義されていません。コンパイラはaを逆参照して名前のない一時的なテンポラリを作成することになるので、名前付き変数を作成しなくても未定義です。したがって、このステートメント:

* a; 

も定義されていません。

+0

最初のケースでは、ポインタが保持しているアドレスを読み込んでいます。私はそれが不在であることを理解する。逆参照演算子を使用するときに参照に渡すとき、私はそれが別のポインタに行うのと同じように、アドレス値を送信するだけなので、逆参照しているかどうか疑問に思っています。 – Zebrafish

+0

参照はポインタではありません。 –

+0

私は、私がcallfunction(* obj)を実行したときに参照解除が全く行われていないことを疑うと、リファレンスはオブジェクトのアドレスを取ります。 – Zebrafish

関連する問題