LINUX.ORG.RU

intro.execution/6 + basic.stc/4 = ?

 ,


0

0

[intro.execution]p6 заявляет, что «An instance of each object with automatic storage duration is associated with each entry into its block. Such an object exists and retains its last-stored value during the execution of the block»

[basic.stc]p4 заявляет, что «When the end of the duration of a region of storage is reached, the values of all pointers representing the address of any part of that region of storage become invalid pointer values.»

В коде

int main()
{
	auto pi = new int{};
	delete pi;
}

Каково будет значение указателя pi после выполнения delete pi? Результат new-expression, а значит и изначальное значение pi, это pointer to object. Согласно [intro.execution]p6 объект должен содержать last-stored value. Согласно [basic.stc]p4, освобождение памяти меняет значение указателя на invalid pointer value. Значит ли, что освобождение памяти приводит к записи (store) в переменную-указатель?

P.S. Шизофреникам, для которых «became invalid pointer value» это «не изменилось»:

Every value of pointer type is one of the following:
— a pointer to an object or function (the pointer is said to point to the object or function), or

— an invalid pointer value.

Надеюсь, «one of the following» ясно даёт понять, что значение не может стать invalid pointer value и при этом оставаться pointer to an object.

Надеюсь, «one of the following» ясно даёт понять, что значение не может стать invalid pointer value и при этом оставаться pointer to an object.

Но при этом может pointer value может стать invalid pointer value не изменяясь.

int *p;
{ int a = 3;
  p = &a;
  // здесь p определён
}
// здесь p не изменился, но стал invalid pointer value, так как a не существует

Собственно, basic.stc именно это и утверждает.

monk ★★★★★ ()
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от monk

Ты, видимо, пытаешься сказать что-то вроде: «значение указателя поменялось» это не «значение, сохранённое в указателе было заменено на другое», а «значение, сохранённое в указателе, СТАЛО другим». Типа как если бы в int x = 0; x = 1; это не значение 0 было заменено на значение 1, а значение осталось прежним (0), но 0 теперь СТАЛ 1.

В общем, это неправильное понимание. Его даже изложить сложно так, чтобы не звучало как бред. Хотя я такое мнение уже раньше встречал, да.

vectorisation ()
Ответ на: комментарий от anonymous

Маня, сходи в школу. То, что написано в стандарте описывает то, как ты должен что-то воспринимать. Оно не говорит о том как это должно работать. Тебе сказано, что-бы ты воспринимал значение 0 за 1.

vectorisation ()
Ответ на: комментарий от anonymous

Не верите нашим способностям в английском языке - спросите на форуме, где обитают носители языка. Там пояснят.

Скажем так: у меня есть несколько более непосредственные причины не сомневаться в своей правоте, чем возня вокруг интерпретации слов «становится» и «меняется». :\

vectorisation ()

Стандарт C++ нужно запретить, от него люди с ума сходят.

Или это анонiмус за кресты взялся? Тогда всё ок, он уже был такой.

anonymous ()
Ответ на: комментарий от vectorisation

Раз оно стало другим, значит это значение было записано туда.

Вот у тебя симлинк S указывающий на файл F. Это валидный симлинк. Потом ты удалил файл F. Симлинк S стал невалидным, хотя операция удаления файла F никак не поменяла симлинку S.

Это особенности какой-то (каких-то) реализации(й),

Нет.
Мы обсуждаем не изменение значения, а изменение характеристики значения: valid pointer, invalid pointer. Характеристика может меняться либо 1) посредством изменения значения (в данном случае указателя), либо 2) посредством изменения каких-то других вещей, в данном случае посредством изменения аттрибутов памяти. Стандарт явно говорит, что «retains its last-stored value», значит исключает первый вариант. Остается второй. Прости пожалуйста, что в стандарте этого явно не прописали. Найдёшь третий вариант - welcome, стандарт его будет допускать. Главное что тебе нужно уяснить - изменение характеристики valid/invalid может происходить не только в следствии изменения значения.

Kroz ★★★★★ ()
Ответ на: комментарий от Kroz

Вот у тебя симлинк S указывающий на файл F. Это валидный симлинк. Потом ты удалил файл F. Симлинк S стал невалидным, хотя операция удаления файла F никак не поменяла симлинку S.

Аналогии это, конечно, очень убедительно (нет).

Нет.

Дат.

Мы обсуждаем не изменение значения, а изменение характеристики значения

Не знаю, с кем вы там обсуждаете изменение характеристик значения, но мне не особо интересно в ваших обсуждениях на тему неизвестно откуда взявшихся понятий участвовать. Стандарт говорит про значения, а не «характеристики значения».

посредством изменения каких-то других вещей, в данном случае посредством изменения аттрибутов памяти

Опять особенности каких-то реализаций...

Стандарт явно говорит, что «retains its last-stored value», значит исключает первый вариант.

Стандарт говорит что «retains its last-stored value» и что в результате некоего события X значение меняется. Отсюда единственный вывод — событие X привело к store нового значения. Элементарная логика.

Главное что тебе нужно уяснить - изменение характеристики valid/invalid может происходить не только в следствии изменения значения.

«характеристика значения» это твоя (или твоей компании, с которой ты это обсуждаешь) выдумка.

vectorisation ()
Ответ на: комментарий от Kroz

Может человек пишет свой собственный компилятор, да ещё под какую-нибудь хитрую архитектуру? Ну, так... Типа придумал вариант событий при котором такой вопрос вообще может возникнуть )

Toxo1 ()
Ответ на: комментарий от vectorisation

в чём, собственно, толстота?

в шапке и каждом посту.

По-моему, я использовал очень короткий и легко проверяемый логический вывод.

с другими развлекайся

SR_team ★★★ ()
Ответ на: комментарий от ox55ff

В C, кстати, дела ещё хуже, т.к. там значение указателя становится не invalid, а indeterminate.

Чтение invalid p.v. имеет impl.-def. behavior, а вот intermediate — undefined.

Значит какой-нибудь локфри стек, который сравнивает указатель на вершину, значение которого стало indeterminate, приводит к неопределенному поведению (конечно, реализация может доопределить поведение в случае чтения indeterminate-значений, но это уже расширение языка). Тут даже не важно, считаешь ты что изменение значения на indeterminate было записью в указатель или не было.

vectorisation ()