web-dev-qa-db-ja.com

mallocはC ++ 17で「無効なポインター値」を返しますか?

C++ 17 [basic.compound]/3によると:

ポインタ型のすべての値は、次のいずれかです。

  • オブジェクトまたは関数へのポインター(ポインターはオブジェクトまたは関数を指すといいます)、または
  • オブジェクトの終わりを過ぎたポインタ(8.7)、または
  • その型のnullポインター値(7.11)、または
  • 無効なポインタ値。

malloc関数はポインター値を返します。呼び出しが成功したと仮定して、戻り値がnullにならないようにします。 malloc([c.malloc])の仕様は、返されたストレージにオブジェクトを作成することを明記していないため、「無効なポインター値」が最も意味のないカテゴリであるように見えます。

16
Brian

それは理にかなっている。オブジェクトを指さないため、これは「無効なポインター値」です。

そのセクションの後半を参照してください:

ポインター値は、それが示すストレージがストレージ期間の終わりに達すると無効になります

これは、ポインタを無効にするのはポインタの「値」ではなく、有効なオブジェクトを指していないことを意味します。

8
Marshall Clow

それは正しいです。

メモリ内のその場所にオブジェクトはありません。記憶は「あなたに属している」。ただし、ポインタが有効かどうかは、メモリ割り当てではなく、ポインタが指すオブジェクトの存在によって決まります。このポインタはどのオブジェクトも指していないため、無効なポインタです。

p0593rX 、将来採用される場合、基本的にオブジェクトをそこに置くことでこれを変更します。現時点でC++でmallocを使用すると(配置の新規を含め)考えられる動作が定義されていないため、これは実際には非常に重要です。