For instance, consider the variable declaration: string* a
, if I do std::cout << *a
, then is the program possible crash? I am thinking the memory of the pointer a
is pointing to might be a bad memory. If yes, what is the "Bad Memory"?
3 に答える
必ずクラッシュするという保証はありません。たとえば、ポインタが参照するメモリは、プログラムが読み取り権限を持つメモリのページ内にある可能性があります。その場合、プログラムはsegfaultによって完全にクラッシュすることはありません。これが、「不良メモリ」または「ガベージ メモリ」と呼ばれる理由です。null ターミネータの近さによっては意味不明な出力になる可能性がありますが、基本的には未定義の動作です。
is the program possible crash?
-> はい、a がプロセスに許可されているメモリを参照していない場合は、segfault する必要があります。
ポインタを宣言するだけで初期化しない場合、そのアドレスには任意の値が含まれる可能性があります。多くの場合、それは有効なアドレスではないか、プログラムが読み取りおよび/または書き込みを許可されていないアドレスであることを意味します。このようなポインターを逆参照しようとすると、不正な操作になる可能性があるため、通常、プログラムはクラッシュし、OS はアクセス違反などを報告します。
理論的には、ポインターは、プログラムがアクセスできる有効なアドレスになる可能性もあります。ただし、ほとんどの場合、意味のあるデータは含まれていないため、それを介してアクセスするものはすべてナンセンスになります。