Значение действительного указателя

В комментариях к this ответ я наткнулся на дискуссию о значении "действительный указатель". Поскольку я думаю, что это интересно вообще:

Что такое "действительный указатель" в С++?

В частности:

Является ли reinterpret_cast<const void*>(0x1) допустимым указателем?

Ответ 1

Стандарт помещает реализации в две общие категории:

  • Те, у кого строгая безопасность указателей
  • Те, у кого есть расслабленная безопасность указателей

Ваше выражение определенно не является безопасным образом, так как оно недействительно в первом.

Цитата из 3.7.4.3:

Реализация может иметь расслабленную безопасность указателя, и в этом случае ценность значения указателя не зависит от того, является ли это безопасным производным значением указателя. В качестве альтернативы, реализация может иметь строгую безопасность указателей, и в этом случае значение указателя, относящееся к объекту с динамической продолжительностью хранения, которое не является безопасным производным значением указателя, является недопустимым значением указателя, если только объявленный полный объект ранее не был объявлен достижимым (20.7 +0,4). [Примечание: эффект использования недопустимого значения указателя (включая передачу его функции освобождения) равен undefined, см. 3.7.4.2. Это справедливо даже в том случае, если значение указателя, которое не имеет значения, могло бы сравниться с каким-либо безопасным производным значением указателя. - end note] Реализация определяется, была ли релаксация реализации или строгая безопасность указателя.

Для реализаций с расслабленной безопасностью не имеет значения, как получено значение указателя, просто (3.9.2):

Допустимое значение типа указателя объекта представляет собой либо адрес байта в памяти (1.7), либо нулевой указатель.

Является ли 0x1 допустимым адресом памяти в вашей системе? Ну, для некоторых встроенных систем это так. Для большинства ОС, использующих виртуальную память, страница, начинающаяся с нуля, зарезервирована как недействительная.