C++ 17 [basic.compound]/3によると:
ポインタ型のすべての値は、次のいずれかです。
- オブジェクトまたは関数へのポインター(ポインターはオブジェクトまたは関数を指すといいます)、または
- オブジェクトの終わりを過ぎたポインタ(8.7)、または
- その型のnullポインター値(7.11)、または
- 無効なポインタ値。
malloc
関数はポインター値を返します。呼び出しが成功したと仮定して、戻り値がnullにならないようにします。 malloc
([c.malloc])の仕様は、返されたストレージにオブジェクトを作成することを明記していないため、「無効なポインター値」が最も意味のないカテゴリであるように見えます。
それは理にかなっている。オブジェクトを指さないため、これは「無効なポインター値」です。
そのセクションの後半を参照してください:
ポインター値は、それが示すストレージがストレージ期間の終わりに達すると無効になります
これは、ポインタを無効にするのはポインタの「値」ではなく、有効なオブジェクトを指していないことを意味します。
それは正しいです。
メモリ内のその場所にオブジェクトはありません。記憶は「あなたに属している」。ただし、ポインタが有効かどうかは、メモリ割り当てではなく、ポインタが指すオブジェクトの存在によって決まります。このポインタはどのオブジェクトも指していないため、無効なポインタです。
p0593rX 、将来採用される場合、基本的にオブジェクトをそこに置くことでこれを変更します。現時点でC++でmalloc
を使用すると(配置の新規を含め)考えられる動作が定義されていないため、これは実際には非常に重要です。