powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / В какой указатель запись будет произведена первой?
25 сообщений из 41, страница 1 из 2
В какой указатель запись будет произведена первой?
    #39881942
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первый тест на знание C++ sql.ru (ожидаемо) провалил. Когда я подумал что дно уже достигнуто, снизу постучался некто MasterZiv, утверждая, что `int* const ptr = new int{};` это динамическое создание константного объекта ( 21998710 ). Ладно, вопрос попроще.

Есть код
Код: plaintext
1.
2.
3.
4.
5.
6.
int main()
{
  int* p1 = new int{};
  int* p2 = p1;
  delete p1;
}


Сказано, что при освобождении памяти значения всех указателей (которые попадают под определённое условие) становятся invalid pointer values.
basic.stc/4When 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.
Также про объекты с automatic storage duration известно что они сохраняют последнее записанное в них значение .
intro.execution/6An 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 and while the block is suspended ...

Если значение стало другим (invalid pointer value), значит это изменение значения было записью (иначе бы сохранилось последнее записанное, которое, очевидно, не invalid pointer value).

В каком порядке в указатели записывается invalid pointer value? Сначала в p1 или в p2?
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881948
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axisЕсли значение стало другим (invalid pointer value), значит это изменение значения было записью (иначе бы сохранилось последнее записанное, которое, очевидно, не invalid pointer value).invalid pointer value - не означает что значение стало другим.

Ладно, давай так попробуем:

- У тебя есть книжный стеллаж с полками. Пустой. И тетрадка чистая.
- Ты кладешь на самую нижнюю полку книжку а в тетрадку пишешь: "книжка на нижней полке".
- Открываешь другую страницу в тетрадке и пишешь тоже самое "книжка на нижней полке".
- Кладешь тетрадку на стол, подходишь к стеллажу и забираешь книжку.
СТОП!
Какой текст сейчас записан на страницах тетрадки?
Стали ли записи в тетрадке правильными или стали неправильными?

Ответь на эти два вопроса.
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881950
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня - тягостное дежа-вю. Мне кажется мы уже обсуждали этот вопрос.
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881954
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlZ axisЕсли значение стало другим (invalid pointer value), значит это изменение значения было записью (иначе бы сохранилось последнее записанное, которое, очевидно, не invalid pointer value).invalid pointer value - не означает что значение стало другим.Почему?
White OwlЛадно, давай так попробуем:

- У тебя есть книжный стеллаж с полками. Пустой. И тетрадка чистая.
- Ты кладешь на самую нижнюю полку книжку а в тетрадку пишешь: "книжка на нижней полке".
- Открываешь другую страницу в тетрадке и пишешь тоже самое "книжка на нижней полке".
- Кладешь тетрадку на стол, подходишь к стеллажу и забираешь книжку.
СТОП!
Какой текст сейчас записан на страницах тетрадки?
Стали ли записи в тетрадке правильными или стали неправильными?

Ответь на эти два вопроса.Можно я отвечу цитатой?
Рибо «Эволюция общих идей»Рассуждение по аналогии представляет собою рассуждение уже гораздо более высокого порядка. Оно является главным логическим орудием ребёнка и первобытного человека.
Я предпочитаю более убедительные методы рассуждений, чем аналогии.
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881957
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axisМожно я отвечу цитатой?Нельзя. Подумай над моим вопросом и ответь сам.
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881958
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
До и после delete значения указателя не меняются.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
$ cat probe.cpp 
#include <stdio.h>

int main()
{
  int* p1 = new int{};
  int* p2 = p1;
  printf("Sizeof pointer = %lu bytes\n", sizeof(p1));
  printf("Physicall value of pointers before 'delete' = %016lx\n", p1);
  delete p1;
  printf("Physicall value of pointers after 'delete' = %016lx\n", p1);
}



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
$ uname -a
Linux ryzen-ssd 5.0.0-32-generic #34~18.04.2-Ubuntu SMP Thu Oct 10 10:36:02 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
$ 
$ c++ --version
c++ (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ c++ probe.cpp && ./a.out
                                                                     ^
Sizeof pointer = 8 bytes
Physicall value of pointers before 'delete' = 000055e364b7ee70
Physicall value of pointers after 'delete' = 000055e364b7ee70
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881959
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДо и после delete значения указателя не меняются.А о чём говорится в [basic.stc]/4 тогда?
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881960
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axismaytonДо и после delete значения указателя не меняются.А о чём говорится в [basic.stc]/4 тогда?о том, что пользоваться p2 после удаления p1 ты можешь только на свой страх и риск, более того, язык гарантирует, что у тебя в программе будет ошибка, если ты им будешь пользоваться особенно умело)
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881961
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axismaytonДо и после delete значения указателя не меняются.А о чём говорится в [basic.stc]/4 тогда?
Подожди. Ты в топике - ученик. Падаван. И не влючай менторский тон. Ты пришел
с незнанием. Ты пришел с вопросом. И будь добр. Держи лицо таким чтобы все
видели что ты внимаешь и слушаешь опытных ОК?

А теперь если ок тогда вопрос.

Ты согласен что указатель - это целое число которое указывает на ячейку памяти?

Я об этом писал в закрытом топике. И ты тогда ответил - нет. Очевидно у тебя были
какие-то другие соображения.
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881962
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlZ axisМожно я отвечу цитатой?Нельзя. Подумай над моим вопросом и ответь сам.Да я думаю можно. Ответ ванильной цитаткой это вполне на уровне рассуждений аналогиями.
Ну да ладно. Текст записан тот же, но записи — неправильны. Я это должен был ответить?

Только проблема в том, что эта аналогия не соответствует моему вопросу. В этом проблема рассуждений аналогиями. Трудно (если возможно) подобрать корректную.
Я знаю вопрос соответствующий аналогии, но говорить (пока) не буду.
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881963
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonZ axisпропущено...
А о чём говорится в [basic.stc]/4 тогда?
Подожди. Ты в топике - ученик. Падаван. И не влючай менторский тон. Ты пришел
с незнанием. Ты пришел с вопросом. И будь добр. Держи лицо таким чтобы все
видели что ты внимаешь и слушаешь опытных ОК?А где менторский тон? Я и задал вопрос: о чём говорится в [basic.stc]/4.

maytonА теперь если ок тогда вопрос.

Ты согласен что указатель - это целое число которое указывает на ячейку памяти?Не знаю. Что стандарт говорит?
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881964
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТС болен, а вы не врачи, забаньте его и всё, зачем издеваться, все равно этим закончится.
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881965
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axisWhite Owlпропущено...
Нельзя. Подумай над моим вопросом и ответь сам.Да я думаю можно. Ответ ванильной цитаткой это вполне на уровне рассуждений аналогиями.
Ну да ладно. Текст записан тот же, но записи — неправильны. Я это должен был ответить?Да. Верно.
Так вот в данной ситуации - указатели это странички в тетрадке. Текст на страничках не изменяется, но он становится неверным.
Точно так же и с указателями - они сами не изменяются, но становятся неверными.


Z axisВ этом проблема рассуждений аналогиями. Трудно (если возможно) подобрать корректную.Трудно, не означает невозможно.
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881966
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axismaytonпропущено...

Подожди. Ты в топике - ученик. Падаван. И не влючай менторский тон. Ты пришел
с незнанием. Ты пришел с вопросом. И будь добр. Держи лицо таким чтобы все
видели что ты внимаешь и слушаешь опытных ОК?А где менторский тон? Я и задал вопрос: о чём говорится в [basic.stc]/4.

maytonА теперь если ок тогда вопрос.

Ты согласен что указатель - это целое число которое указывает на ячейку памяти?Не знаю. Что стандарт говорит?
Я не помню стандарт наизусть.

Ты согласен что ты видел своими глазами что указатель хранит просто целое число?
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881967
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ не помню стандарт наизусть.А зачем помнить? Можно взять последний перед стандартизацией драфт и посмотреть https://timsong-cpp.github.io/cppwp/n4659/
maytonТы согласен что ты видел своими глазами что указатель хранит просто целое число?Это ты про код свой?
Не согласен. Код полон UB из-за некорректной форматной строки, а ещё там небольшая кучка implementation-defined behavior и вообще как кто-то сказал в прошлом треде: компилятор не обязательно на 100% соответствует стандарту.
Если возможно, что код выполняется не так, как требует стандарт, то такой способ рассуждений так же неубедителен, как рассуждения аналогиями.
Проще опираться чисто на стандарт.
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881968
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axismaytonЯ не помню стандарт наизусть.А зачем помнить? Можно взять последний перед стандартизацией драфт и посмотреть https://timsong-cpp.github.io/cppwp/n4659/
А что перед тем как умножать числа я должен каждый раз перечитывать таблицу Пифагора?
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881970
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axisПроще опираться чисто на стандарт.

Для теоретиков - да. Те, кто пишут реальные программы для реальных компьютеров, учитывают
их работу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881971
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axisЭто ты про код свой?
Не согласен. Код полон UB из-за некорректной форматной строки, а ещё там небольшая кучка implementation-defined behavior и вообще как кто-то сказал в прошлом треде: компилятор не обязательно на 100% соответствует стандарту.
Если возможно, что код выполняется не так, как требует стандарт, то такой способ рассуждений так же неубедителен, как рассуждения аналогиями.
Проще опираться чисто на стандарт.
Отлично. Ты опирался на стандарт. Опирался 3 раза. Создал 3 топика. У тебя от чтения стандарта
стало ясно в голове?

Да в коде бывают UB. Я тебе показал частный случай чтобы ты понял что указатель это целое число
которое указывает на ячейку памяти. И никакого признака invalid pointer value оно внутри себя
не хранит потому что хренить этот признак негде. Это простая логика для которой не нужно
читать стандарты.

Хотя есть еще и значение NULL. Но в данном частном примере мы наблюдали забавное поведение
когда компиллятор GCC в дефолтном режиме настроек ничего не обнулял и не инвалидировал.

Блоки выделенной памяти кстати существуют отдельно от твоих указателей. Ими ведает операционная
система. Вот и думай дальше как эти факты увязать в голове.

Стандарты читай. Читай и проверяй.
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881972
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axis,

тебе уже объяснили, что invalid pointer value это не "значение", а "состояние".

никто ничего не меняет в самих указателях, когда ты делаешь delete.
изменяется состояние памяти, на которую они указывают: была чья-то, стала - свободна.

Поскольку память освободили, то все указатели, которые смотрели в эту точку теперь смотрят на освобожденный кусок памяти, работать с которым им запрещают законы языка/ОС и здравого смысла.

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

Но это не так!

Указатель - это, прежде всего, переменная! Иначе где и как бы он хранил свой адрес?
Если ты создал экземпляр второго указателя p2, значит ты потратил память стека на хранение его значения, а не создал 2-ой указатель, который разделяет память первого!

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

Если переформулировать твой пример, с учетом вышесказанного, то
Код: plaintext
1.
2.
3.
int n = 3;
int x = n;
n = 0;

когда x станет 0?

никогда!
потому что x - это копия n, а не n

p2 является копией p1, также как и x является копией n, поэтому, когда менеджер памяти тебе возвращает указатель, он не может знать что ты с ним делаешь. Потому что у тебя своя копия, а у него - его личная.

Чтобы изменились все указатели сразу, как только ты делаешь delete, нужно чтобы они разделяли свое состояние, а не были копиями. Единственное что разделяют эти указатели - это адрес памяти, куда они смотрят.

Сдвинь p1 на 1 байт, p2 при этом никак не изменит своего значения!
Он по-прежнему будет смотреть туда же, куда и смотрел до этого.

Сдвиг изменяет значение того указателя, к которму он применен, а delete изменяет "значение" памяти, на которую указатели смотрят. Но поскольку "изменение памяти" при delete носит скорее логический смысл чем физический (ячейки же на плате не сгорают), то invalid pointer value, следует интерпретировать как состояние указателей, которые стали смотреть на освобожденную память, но их фактические адреса никак не пострадали от этого - они по преженему смотрят туда же, куда смотрели до вызова delete.
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881973
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДа в коде бывают UB. Я тебе показал частный случай чтобы ты понял что указатель это целое число
которое указывает на ячейку памяти. И никакого признака invalid pointer value оно внутри себя
не хранит потому что хренить этот признак негде. Это простая логика для которой не нужно
читать стандарты.Насколько мне известно, разным значениям не обязано соответствовать разное представление этих значений. (Т.е. 2 объекта, хранящие 2 различных значения не обязаны побитово различаться).
maytonХотя есть еще и значение NULL. Но в данном частном примере мы наблюдали забавное поведение
когда компиллятор GCC в дефолтном режиме настроек ничего не обнулял и не инвалидировал.Как ты сам сказал, признака invalid pointer value может и не храниться "внутри". Как ты тогда определил, инвалидировал он или не инвалидировал?
maytonСтандарты читай. Читай и проверяй.Относительно чего проверять стандарт?
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881974
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axisОтносительно чего проверять стандарт?

Относительно реальности, данной нам в ощущениях.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881975
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrumтебе уже объяснили, что invalid pointer value это не "значение", а "состояние".Правда, не сказали, откуда это взято. Где в стандарте это написано.
А я, в отличие от, указал, где сказано, что это "значение". В [basic.compound]/3. Прилагаю релевантный скрин
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881976
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axisinvalid pointer value может и не храниться "внутри". Как ты тогда определил, инвалидировал он или не инвалидировал?

Я распечатал длину указателя 8 байтов. И его содержимое. Целое. Гребаное целое число из 8 байтов.
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881977
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Z axisне сказали, откуда это взято. Где в стандарте это написано.

Там, где даётся определение понятию "invalid pointe value".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
В какой указатель запись будет произведена первой?
    #39881978
Z axis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonZ axisinvalid pointer value может и не храниться "внутри". Как ты тогда определил, инвалидировал он или не инвалидировал?

Я распечатал длину указателя 8 байтов. И его содержимое. Целое. Гребаное целое число из 8 байтов.Это не значит что значение указателя это число.
...
Рейтинг: 0 / 0
25 сообщений из 41, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / В какой указатель запись будет произведена первой?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]