С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
0 / 0 / 0
Регистрация: 28.03.2015
Сообщений: 32

Особенность указателей

12.07.2020, 18:24. Показов 4882. Ответов 66
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, есть вот такой код:
C++
1
2
3
4
5
6
7
8
        
char* s1 = new char[5];
strcpy_s(s1, 5, "some");
char* s2 = s1;
delete s1;
if (s1 == s2) {
    cout << "true ???" << endl;
}
Собственно вопрос - гарантируется ли что после delete значение в s1 сразу-же изменится или это зависит от конкретной операционной системы ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.07.2020, 18:24
Ответы с готовыми решениями:

Почему в сортировке указателей на объекты в вызове функции используются адреса объектов, а не указателей?
Доброго времени суток! Рассматриваю пример (из Лафоре) сортировки массива указателей на объекты, для чего используются указатели на...

Объяснить различия в работе указателей на целое число и указателей на const char (строки в стиле Си)
Уважаемые программисты, возникло несколько вопросов касательно указателей. Почему при выводе указателя на int нужна звёздочка (*), а...

Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей
Задача: создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей. Вернуть адрес...

66
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
12.07.2020, 18:41
Цитата Сообщение от alaksion Посмотреть сообщение
Собственно вопрос - гарантируется ли что после delete значение в s1 сразу-же изменится или это зависит от конкретной операционной системы ?
s1 после delete не изменится. Просто удалится его содержимое.
0
0 / 0 / 0
Регистрация: 28.03.2015
Сообщений: 32
12.07.2020, 18:54  [ТС]
oleg-m1973, s1 - адрес в памяти на 1 элемент массива, после delete сразу же "затирается" значение ? или ос помечает что адрес s1 свободен для записи и не понятно, когда изменится ?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
12.07.2020, 19:00
Цитата Сообщение от alaksion Посмотреть сообщение
или ос помечает что адрес s1 свободен для записи и не понятно, когда изменится ?
Да, примерно так. Содержимое памяти, на которое указывает s1 не изменится, пока туда кто-нибудь что-нибудь не запишет.
Только не путай указатель и содержимое указателя. У тебя (s1 == s2) всегда будет true, а вот (*s1 == *s2) не всегда.
0
0 / 0 / 0
Регистрация: 28.03.2015
Сообщений: 32
12.07.2020, 19:18  [ТС]
oleg-m1973, Теперь я окончательно запутался. Как можно проверять что по указателю произвели delete ?
К примеру есть 2 массива: 1) Указателей 2) списков из этих указателей
Идея была удалять элемент из первого массива и в будущем делать проверку на delete во втором
Миниатюры
Особенность указателей  
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
12.07.2020, 19:24
Лучший ответ Сообщение было отмечено alaksion как решение

Решение

Цитата Сообщение от alaksion Посмотреть сообщение
oleg-m1973, Теперь я окончательно запутался. Как можно проверять что по указателю произвели delete ?
Правильно, нельзя. Но, так ты задал вопрос.

Цитата Сообщение от alaksion Посмотреть сообщение
Идея была удалять элемент из первого массива и в будущем делать проверку на delete во втором
Так не получится. Надо использовать std::shared_ptr/std::weak_ptr
1
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
12.07.2020, 19:36
Цитата Сообщение от alaksion Посмотреть сообщение
после delete сразу же "затирается" значение ?
Нет. Просто сразу после delete любое обращение к разыменованному указателю может привести к вылету программы. Не всегда, и с некоторой вероятностью, но суть остаётся. Ровно то же самое относится и к обращению s1[5] или s1[6] до delete (оно может как пройти незамеченным при отладке, так и вызывать вылет).

А вот сами адреса в указателях ничего сравнивать не мешает, вне зависимости от того, на какую область памяти эти адреса указывают. if (s1 == s2) можешь делать когда угодно. Вот только тебе не это нужно для сравнения строк, содержащихся по адресам в указателях. Гугли strcmp и strcpy

Добавлено через 3 минуты
Цитата Сообщение от alaksion Посмотреть сообщение
или ос помечает что адрес s1 свободен для записи и не понятно
помечает, что твоя программа больше не может пользоваться памятью по этому адресу, а могут пользоваться другие программы. Содержимое памяти при этом может или никак не меняться, или потом измениться другими программами.
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
13.07.2020, 05:13
Цитата Сообщение от alaksion Посмотреть сообщение
Собственно вопрос - гарантируется ли что после delete значение в s1 сразу-же изменится
Да, причём значение изменится и у s1, и у s2:
Цитата Сообщение от https://timsong-cpp.github.io/cppwp/n4659/basic.stc#4
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.
---
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
s1 после delete не изменится
И это неправильный ответ.
Цитата Сообщение от TRam_ Посмотреть сообщение
А вот сами адреса в указателях ничего сравнивать не мешает
Ну-ну.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
13.07.2020, 10:52
Цитата Сообщение от argcargv Посмотреть сообщение
И это неправильный ответ.
Да? И в чём же его "неправильность"?
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
13.07.2020, 11:29
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
И в чём же его "неправильность"?
Кого — его?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
13.07.2020, 11:38
Цитата Сообщение от argcargv Посмотреть сообщение
И вот думаешь, то ли правда настолько читать не умеют, то ли это хуцпа такая особенная: спрашивать, в чём неправильность сразу после достаточно подробного пояснения — в чём.
Ты своё что-ли "пояснение" называешь подробным? Которое "ну-ну"?
Ты хотя бы различаешь, что такое значение указателя и что такое содержимое памяти, на которую он указывает?
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
13.07.2020, 11:43
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Ты своё что-ли "пояснение" называешь подробным? Которое "ну-ну"?
Выше "---" глаза не поднимаются?
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Ты хотя бы различаешь, что такое значение указателя и что такое содержимое памяти, на которую он указывает?
Да, а ты?
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
13.07.2020, 11:46
Цитата Сообщение от argcargv Посмотреть сообщение
become invalid pointer values
Значения получат статус "полученные по недопустимому указателю".
Но это вообще никак не определяет, какими именно они будут. Нет, если используется отладочная куча, то new/delete будут заполнят память специальными значениями ( https://docs.microsoft.com/en-... ew=vs-2019 ) но в случае выключения всего этого значения в памяти не будут меняться при освобождении - это очень нерационально в плане производительности.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
13.07.2020, 11:46
Лучший ответ Сообщение было отмечено alaksion как решение

Решение

Цитата Сообщение от alaksion Посмотреть сообщение
Собственно вопрос - гарантируется ли что после delete значение в s1 сразу-же изменится или это зависит от конкретной операционной системы ?
гарантируется, что оно не изменится

значение переменной s1 - адрес объекта.
объект был удален, и значит его адрес уже не валидный.

однако указатель об этом не знает ничего не знает.
он по прежнему содержит тот же самый адрес уже убитого объекта.

Цитата Сообщение от alaksion Посмотреть сообщение
Как можно проверять что по указателю произвели delete ?
в общем случае - никак.

в частных случаях делаешь так:

C++
1
2
delete ptr;
ptr = nullptr;
присваиваешь указателю нуль.
доступ по указателю:

C++
1
2
if(ptr)
    ptr->work();
1
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
13.07.2020, 11:51
Цитата Сообщение от TRam_ Посмотреть сообщение
become invalid pointer values
Цитата Сообщение от TRam_ Посмотреть сообщение
Значения получат статус "полученные по недопустимому указателю".
Ну это вообще пушка.

Цитата Сообщение от hoggy Посмотреть сообщение
гарантируется, что оно не изменится
В каком месте?
0
0 / 0 / 0
Регистрация: 28.03.2015
Сообщений: 32
13.07.2020, 11:51  [ТС]
Проверил на большом массиве, пикрилл выполнялся всегда. Вот мне и стало интересно, зависит ли код от ОС / компилятора
Миниатюры
Особенность указателей  
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
13.07.2020, 11:54
Цитата Сообщение от alaksion Посмотреть сообщение
Вот мне и стало интересно, зависит ли код от ОС / компилятора
Можно сказать что поведение твоего кода зависит от реализации. Вот весь параграф [basic.stc]/4:
Цитата Сообщение от https://timsong-cpp.github.io/cppwp/n4659/basic.stc#4
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. Indirection through an invalid pointer value and passing an invalid pointer value to a deallocation function have undefined behavior. Any other use of an invalid pointer value has implementation-defined behavior.37

37) Some implementations might define that copying an invalid pointer value causes a system-generated runtime fault.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
13.07.2020, 11:57
Цитата Сообщение от argcargv Посмотреть сообщение
В каком месте?
в стандартном.
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
13.07.2020, 11:58
Цитата Сообщение от hoggy Посмотреть сообщение
в стандартном.
Это ты так теперь свой "здраый смысл" называешь? Стандартным местом.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
13.07.2020, 11:59
alaksion, так ты можешь сравнивать указатели вообще с какими угодно значениями. Да хоть даже так:

C++
1
2
3
char* s1 = 0x1234;
char* s2 = 0x4321;
cout << (s1==s2)<<endl;
и это будет абсолютно корректно с точки зрения синтаксиса и исполнения.

Добавлено через 53 секунды
Но я почти абсолютно уверен, что тебе не то сравнение нужно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.07.2020, 11:59
Помогаю со студенческими работами здесь

Создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей
Нужно создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей. Эта специализация...

Различия указателей char* от указателей других типов
Помогите пожалуйста разобраться! Прочитал раздел про указатели и даже вроде бы понял. Что касается указателей на тип int. Но что...

Как обойтись без указателей и указателей на указатель?
Ибо не совсем выходит понять,что на что тут указывает #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;stdlib.h&gt; using...

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

Особенность циклов в c++
Здравствуйте , я новичек в программировании, поэтому могу чего-то не знать. Сегодня я заметил неприятную особенность в циклах. Даже когда...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru