Короче говоря, считается ли следующий код неопределенным поведением?
int main()
{
int *p = <some invalid pointer value>;
}
Для примера компиляции возьмите следующий код:
int main()
{
int *p = new int;
delete p; // Now p has an invalid pointer value.
int *q = p; // UB?
}
Я провел некоторое исследованиепо теме, так что это соответствующая информация, которую я нашел до сих пор:
Значение указателя (согласно cppreference ) может быть одним из:
- Указатель на объект или функцию;
- указатель за концом объекта;
- значение нулевого указателя;
- недопустимое значение указателя.
Кроме того, согласно cppreference,
Переадресация через недопустимое значение указателя и передача недопустимого значения указателя в функцию освобождения имеет неопределенное поведение.Любое другое использование недопустимого значения указателя имеет поведение, определяемое реализацией.
В этом потоке рассматриваются некоторые случаи использования недопустимых указателей.В частности, этот ответ упоминает Обоснование документа (C99), который имеет следующий параграф (раздел 6.3.2.3):
Независимо от того, как недопустимый указательсоздается, любое его использование приводит к неопределенному поведению.Даже присваивание, сравнение с константой нулевого указателя или сравнение с самим собой в некоторых системах может привести к исключению.
Я не уверен, как обстоят дела с C ++, но я бы хотелУчтите, что, учитывая ответы в связанной ветке, использует недопустимых указателей, что приводит к неопределенному поведению.Обратите внимание, что присваивание отличается от initialization , поэтому я не уверен, что инициализация считается использованием.