38

私は C++ を学んでいますが、ポインタが初期化されていない場合、メモリ内のランダムな場所を指す可能性があり、メモリが他のプログラムによって使用される可能性があるという問題が発生する可能性があることを知りました。

その場合、コードのどの部分にもこの行を含めるべきではありません。

int* ptr;

代わりに、次のようなものが必要です

int* ptr = NULL; //Is this going to avoid the problem

int* ptr;多くの本で最初の行( )を見たので、この疑問を抱いているので、提案してください。可能であれば、いくつかの例も挙げてください。

4

8 に答える 8

45
int* ptr = NULL; //Is this going to avoid the problem

これにより、デフォルト/初期化されていない値として明示的にチェックできるptrポイントが発生します。NULLあなたが説明した問題を防ぎますが、不注意なプログラマーは、チェックせずに誤ってヌルポインターを逆参照して、未定義の動作を引き起こす可能性があります。

主な利点は、 が何かに初期化されているかどうかを確認できる便利さですptr。つまり、次のようになります。

 if (ptr != NULL)
 {
     // assume it points to something
 }

これは非常に慣用的であるため、ポインタを に初期化しないことは非常に危険NULLです。ポインターは、実際には何も指していない NULL 以外のガベージ値に初期化されます。何よりもまずいのは、上記のチェックに合格し、ポインタのアドレスが合法的にアクセスできるメモリであるということが起こった場合、さらに悪い問題を引き起こすことです。一部の組み込み環境では、メモリの任意の部分にアクセスできる場合があるため、メモリのランダムな部分または実行コードのランダムな部分を誤って破損する可能性があります。

于 2011-05-03T13:19:29.040 に答える
11

常に変数を初期化してください。

に初期化したい場合もありますが、ほとんどの場合、ポインターを保持するはずの値にNULL初期化できるはずです。変数はできるだけ遅く宣言し、コードの 15 行下ではなく、その時点で初期化します。

于 2011-05-03T13:25:22.663 に答える
6

この線:

int* ptr;

ポインター値を特定のものに初期化することは絶対に保証されていません。この線:

int* ptr = NULL;

アドレス 0 を指すようにポインターを初期化します。これは、実際には有用なものを保持することはなく、通常は無効なポインター値としてチェックされます。

もちろん、Doug T. が言ったように、このポインターをチェックせずに使用しようとする可能性はまだあります。

明示的に NULL に初期化すると、ポインターを有用なものに設定する前に逆参照すると確実にクラッシュするという利点があります。これは、深刻なバグを隠しながらコードが「誤って」動作するのを防ぐため、実際には良いことです。

于 2011-05-03T13:26:01.957 に答える
3

何らかの理由で宣言中にポインタを初期化できない場合は、常にポインタを NULL に初期化することをお勧めします。例えば:

Object *ptr = new Object();

通常、関数はポインターの値を NULL と照合して、ポインターが以前に初期化されていることを確認できます。明示的に NULL に設定しておらず、ランダムな値を指している場合、逆参照されてセグメンテーション違反が発生する可能性があります。

于 2011-05-03T13:22:05.333 に答える
2

C++ は、安全に設計されていないという点で C に続きます。効率的になるように設計されています。したがって、自動変数が初期化されないのはこのためです。初期化する前にポインターが使用されていないことを確認するのはあなた次第です (ただし、変数を初期化しない場合、多くのコンパイラーが警告します)。

于 2011-05-03T14:09:19.287 に答える
1

ポインターが使用されていない場合、コンパイラーは単純にそれを無視します。NULL に初期化するのが安全です。

関数宣言と混同していませんか? 関数が次のように宣言されることは非常に一般的です。

char* do_something(const char* one,const char* two);

この場合、ポインターは、渡す引数の種類を指定するために使用されます。

于 2011-05-03T13:22:48.530 に答える
-1

C++ では、通常、単純な古いポインターを完全に避ける必要があります。標準ライブラリ クラス、スマート ポインタ (C++0x までは Boost や Loki などのさまざまなライブラリのみ)、および参照は、代わりにほとんどの場所で使用でき、使用する必要があります。

ポインターを避けることができない場合は、初期化で宣言することをお勧めします。ほとんどの場合、NULL ではなく、実際のターゲット値である必要があります。C++ では、宣言と式を自由に混在させることができるため、宣言のみが可能であり、宣言する必要があります。意味のある値を持つ時点の変数。

これは、ポインターを頻繁に使用する必要があり、すべての変数をスコープの先頭で宣言する必要がある (または C99 より前に宣言する必要があった; 正確にはわかりません) C の場合には当てはまりません。非常に多くの人が、C++ にふさわしくない C の悪い習慣をいまだに持っています。

于 2011-05-03T13:25:26.967 に答える